PackLast Partner API

Fordern Sie programmatisch Lieferangebote an und erstellen Sie Kurieraufträge für Ihr Geschäftskunden-Konto. Erstellte Aufträge erscheinen in Ihrem PackLast-Konto und werden gemäß Ihrem Abrechnungszyklus berechnet. Programmatically request delivery quotes and create courier orders for your business (Geschäftskunde) account. Orders appear in your PackLast account and are billed on your agreed billing cycle.

EinführungIntroduction

Mit der Partner-API bucht Ihr System PackLast-Lieferungen Server-zu-Server. Die Integration nutzt zwei Endpunkte: The Partner API lets your system price and book PackLast deliveries server-to-server. The integration uses two endpoints:

Alle übrigen Konto-Aktionen — Registrierung, Vertrag unterschreiben, API-Schlüssel erzeugen sowie Rechnungen ansehen/bezahlen — erfolgen nach Anmeldung in Ihrem Konto unter web.packlast.de. Everything else — registration, signing the contract, generating your API key, and viewing/paying invoices — is done by logging in to your account at web.packlast.de.

Erste Schritte (Aktivierung)Getting started (activation)

Die Aktivierung erfolgt im Konto unter web.packlast.de Schritt für Schritt (Menü „Aktivierung"). Activation happens in your account at web.packlast.de, step by step (the "Aktivierung" menu).

1
Geschäftskonto erstellen. Registrieren Sie sich unter web.packlast.de und wählen Sie Geschäftskunde. Geben Sie Firmenname, USt-IdNr., Rechtsform und Adresse an. Create a business account. Sign up at web.packlast.de and choose Geschäftskunde. Provide your company name, VAT ID, legal form and address.
2
Vertrag unterschreiben. Unter Vertrag prüfen Sie den Vertrag, geben Vor- und Nachname ein, wählen Ihren Abrechnungszyklus (wöchentlich, zweiwöchentlich, monatlich) und unterschreiben elektronisch. Sign the contract. Under Vertrag, review it, enter your first/last name, choose your billing cycle (weekly, bi-weekly, monthly) and sign electronically.
3
Freischaltung durch PackLast. Unser Team prüft Ihr Konto, legt ggf. eine Kaution fest und schaltet es frei. Sie erhalten eine E-Mail (mit der Kautionshöhe, falls erforderlich). Approval by PackLast. Our team reviews your account, sets a security deposit if applicable, and approves it. You receive an email (with the deposit amount, if required).
4
Kaution hinterlegen (falls erforderlich). Unter Wallet zahlen Sie die Kaution. Ist keine Kaution festgelegt, entfällt dieser Schritt. Pay the security deposit (if required). Pay it under Wallet. If no deposit is set, this step is skipped.
5
API-Schlüssel erzeugen & integrieren. Unter API-Schlüssel erzeugen Sie Ihren Schlüssel (pk_live_…, nur einmal sichtbar). Danach rufen Sie Preis berechnen und Bestellung erstellen auf. Alternativ können Sie Bestellungen direkt im Konto unter „Neue Bestellung" aufgeben. Generate the API key & integrate. Under API-Schlüssel generate your key (pk_live_…, shown only once). Then call Calculate price and Create order. Alternatively, place orders directly in your account under "Neue Bestellung".

Der API-Schlüssel kann erst nach Freischaltung und (falls erforderlich) Hinterlegung der Kaution erzeugt werden. Bis dahin können Sie Bestellungen wie ein normaler Kunde mit Zahlung pro Auftrag aufgeben. The API key can only be generated after approval and (if required) paying the deposit. Until then you may order like a normal customer, paying per order.

AuthentifizierungAuthentication

Authentifizieren Sie jeden Aufruf mit Ihrem API-Schlüssel als Bearer-Token: Authenticate every request with your API key as a Bearer token:

Authorization: Bearer pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

PackLast speichert nur einen Hash des Schlüssels — der Klartext ist nur bei der Erzeugung sichtbar und nicht abrufbar. Bei Verlust den Schlüssel im Konto widerrufen und neu erzeugen (der alte wird sofort ungültig). PackLast stores only a hash of the key — the plaintext is shown only at generation and cannot be retrieved. If lost, revoke and regenerate it in your account (the old key is immediately invalidated).

Schlüssel geheim halten. Nur serverseitig verwenden — niemals in einer App, im Browser oder in einem öffentlichen Repository. Der Schlüssel erlaubt das Erstellen kostenpflichtiger Aufträge. Keep your key secret. Use it server-side only — never in an app, browser, or public repo. It grants the ability to create billable orders.

ErgebnisBedeutung
401 Missing API keyKein Authorization: Bearer-Header gesendet.
403 Invalid or revoked API keySchlüssel unbekannt, widerrufen oder kein Geschäftskonto.
ResultMeaning
401 Missing API keyNo Authorization: Bearer header sent.
403 Invalid or revoked API keyKey unknown, revoked, or not a business account.

Basis-URLBase URL

UmgebungEnvironmentBase URL
ProduktionProductionhttps://app.packlast.de/api

Alle Endpunkte sind relativ zur Basis-URL. Senden Sie Content-Type: application/json und Accept: application/json. All endpoints are relative to the base URL. Send Content-Type: application/json and Accept: application/json.

FehlerErrors

StatusBedeutung
200Erfolg.
401API-Schlüssel fehlt.
403Ungültiger/widerrufener Schlüssel oder Konto gesperrt.
402Kreditlimit überschritten — offene Rechnung begleichen.
409Preis hat sich geändert — neu berechnen und neue Signatur verwenden.
422Validierungsfehler — siehe errors-Objekt.
500Serverfehler (z. B. Entfernung nicht berechenbar).
StatusMeaning
200Success.
401Missing API key.
403Invalid/revoked key, or account blocked.
402Credit limit exceeded — settle an open invoice.
409Price changed — re-calculate and use the new signature.
422Validation error — see the errors object.
500Server error (e.g. distance not computable).

So funktioniert die BestellungHow ordering works

Berechnung und Buchung sind durch eine Preis-Signatur verbunden: Pricing and booking are tied together by a price signature:

1
Rufen Sie Preis berechnen mit Ihren Paketen auf. Die Antwort enthält eine calculate_signature. Call Calculate price with your parcels. The response includes a calculate_signature.
2
Rufen Sie Bestellung erstellen mit denselben Paketen plus dieser Signatur auf. Ändert sich ein preisrelevantes Feld, wird die Bestellung mit 409 abgelehnt — Sie zahlen also immer den angebotenen Preis. Call Create order with the same parcels plus that signature. If a price-relevant field changed, the order is rejected with 409 — so you only ever pay the quoted price.

Die Signatur bindet den angebotenen Gesamtpreis. Ändern Sie beim Erstellen etwas, das den Preis beeinflusst (Adressen/Koordinaten, Artikelmaße/-gewichte, Anzahl Pakete, „zweiter Bote"), erhalten Sie 409 Preis hat sich geändert. Die Entfernung berechnet PackLast serverseitig — Sie senden sie nicht. Kontaktnamen, Telefonnummern und Hinweise beeinflussen den Preis nicht und werden erst beim Erstellen ergänzt. The signature binds the quoted gross price. If you change anything that affects the price at order time (addresses/coordinates, item sizes/weights, number of packages, second carrier) you get 409 Price has changed. Distance is computed by PackLast server-side — you don't send it. Contact names, phone numbers and notes don't affect the price and are added at order time.

PreismodellePricing models

Jedem Geschäftskunden ist von PackLast ein Preismodell zugewiesen. Es bestimmt, wie Preis berechnen und Bestellung erstellen den Preis ermitteln. Die API verhält sich exakt wie Ihr Konto — der Endpunkt ist in beiden Modellen derselbe, nur die Preislogik und die Antwortfelder unterscheiden sich. Das aktive Modell steht in jeder Antwort unter price.pricing_model. PackLast assigns every business customer a pricing model. It determines how Calculate price and Create order compute the price. The API behaves exactly like your account — the endpoints are the same for both models; only the pricing logic and response fields differ. The active model is returned in every response under price.pricing_model.

Modellpricing_modelPreisbildung
Standard (größenbasiert)size_basedPreis nach Maßen, Gewicht und Entfernung je Artikel/Route (zzgl. optionalem zweiten Boten). Artikelmaße & -gewichte sind erforderlich.
Paketpreisper_packagePreis pro Paket oder pro Lieferadresse, zzgl. Aufpreis je zusätzlicher Abholadresse. Maße/Gewicht sind nicht erforderlich — gezählt werden Pakete, Lieferadressen und Abholadressen.
Modelpricing_modelHow price is formed
Standard (size-based)size_basedPriced by dimensions, weight and distance per item/route (plus optional second carrier). Item sizes & weights are required.
Paketpreis (per-package)per_packagePriced per package or per delivery address, plus a surcharge per additional pickup address. Sizes/weights are not required — packages, delivery addresses and pickup addresses are counted.

Paketpreis-BerechnungPer-package formula

Der Netto-Preis ergibt sich aus den vom Administrator festgelegten Sätzen. Entweder ein Paketpreis oder ein Lieferpreis ist aktiv (nie beide): The net price is built from the rates your administrator configured. Either a package price or a delivery price is active (never both):

In beiden Modellen ist total_amount der Netto-Preis (ohne MwSt.); die MwSt. wird einmalig auf der Rechnung addiert. Welches Modell für Sie gilt, sehen Sie in jeder Berechnungs-Antwort unter price.pricing_model und im Konto unter Aktivierung. In both models total_amount is the net price (excl. VAT); VAT is added once on the invoice. Your active model is shown in every Calculate response under price.pricing_model and in your account under Aktivierung.

Preis berechnenCalculate price

POST /partner/calculatetotal

Liefert eine Preisaufschlüsselung und eine calculate_signature. Sie senden nur die Pakete — Gesamtgewicht, Artikel-/Routen-Erkennung und Stadt werden serverseitig ermittelt. Returns a price breakdown and a calculate_signature. You only send parcels — combined weight, item/route detection and city are determined server-side.

Request-FelderRequest body

FeldTypBeschreibung
parcels[] erforderlicharrayEin oder mehrere Pakete. Siehe Feld-Referenz.
extra_mann_needed optional0 | 1Zweiter Bote nötig? Standard 0.
FieldTypeDescription
parcels[] requiredarrayOne or more parcels. See Field reference.
extra_mann_needed optional0 | 1Second carrier needed? Defaults to 0.

Beispiel-RequestExample request

curl https://app.packlast.de/api/partner/calculatetotal \
  -H "Authorization: Bearer pk_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "parcels": [
      {
        "pickup_address": "Alexanderplatz 1, 10178 Berlin",
        "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
        "pickup_lat": "52.5219", "pickup_long": "13.4132",
        "delivery_lat": "52.5033", "delivery_long": "13.3289",
        "items": [
          { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
        ]
      }
    ]
  }'

Beispiel-Request — eine Route, ein Artikel (JSON)Sample request — single route, one item (JSON)

{
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
      ]
    }
  ]
}

Beispiel-Request — eine Route, mehrere Artikel (JSON)Sample request — single route, multiple items (JSON)

{
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" },
        { "length": 20, "breadth": 15, "height": 10, "weight": 4.0, "item_name": "Paket" }
      ]
    }
  ]
}

Beispiel-Request — mehrere Routen, mehrere Artikel (JSON)Sample request — multiple routes, multiple items (JSON)

{
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
      ]
    },
    {
      "pickup_address": "Warschauer Str. 70, 10243 Berlin",
      "delivery_address": "Hauptstr. 1, 10827 Berlin",
      "pickup_lat": "52.5053", "pickup_long": "13.4490",
      "delivery_lat": "52.4849", "delivery_long": "13.3520",
      "items": [
        { "length": 25, "breadth": 25, "height": 25, "weight": 8.0, "item_name": "Box A" },
        { "length": 20, "breadth": 15, "height": 10, "weight": 4.0, "item_name": "Box B" }
      ]
    }
  ]
}

Mehrere Pakete = mehrere Routen. Das Gesamtgewicht, die Routen-Erkennung und die Stadt werden serverseitig ermittelt — Sie senden nur die Pakete. Multiple parcels = multiple routes. Combined weight, route detection and city are derived server-side — you only send the parcels.

Beispiel-AntwortExample response 200

{
  "success": true,
  "total_weight": 5.0,
  "total_distance": [8.5],
  "price": {
    "currency": "EUR",
    "distance_km": 9,
    "weight_kg": 5,
    "subtotal": 19.10,
    "tax_percentage": 0,
    "tax_amount": 0,
    "total_amount": 19.10,
    "breakdown": {
      "base_price": 6.50,
      "size_price_total": 6.50,
      "distance_charge": 12.60,
      "extra_man_charge": 0,
      "stop_charge": 0,
      "discount": 0
    },
    "extra_man": {
      "needed": 1,
      "requested": 0,
      "help_required": true,
      "charge": 36,
      "threshold_kg": 35,
      "message": "Aufgrund des Gewichts wird eine zweite Person zum Tragen benötigt …",
      "note": "⚠ Hinweis zur Tragehilfe & Zusatzkosten … 36,00 € pro Stunde …"
    },
    "number_of_stops": null
  },
  "calculate_signature": "e7a1bdb2ebf09715c0fc11f792b6dc225c08f93c3c64dbff8bbb243c7e748a14"
}

Netto-Preise: total_amount ist der Netto-Preis (ohne MwSt.) für diese Bestellung — tax_amount ist daher 0. Die MwSt. wird einmalig auf der Rechnung addiert (Netto-Summe + 19 % = Endbetrag). Setzen Sie extra_mann_needed: 1, wenn ein zweiter Träger benötigt wird; bei schweren Sendungen liefert extra_man.note denselben Hinweis wie die App. distance_km wird beim Standard-Modell serverseitig aus den Koordinaten ermittelt — Sie senden keine Entfernung. Der berechnete Wert wird (informativ) als total_distance je Paket zurückgegeben. Net pricing: total_amount is the net price (excl. VAT) for this order — so tax_amount is 0. VAT is added once on the invoice (net total + 19% = final amount). Set extra_mann_needed: 1 when a second carrier is required; for heavy shipments extra_man.note carries the same guidance as the app. for the Standard model distance_km is computed server-side from the coordinates — you do not send any distance. The computed value is returned (informationally) as total_distance per parcel.

Paketpreis-Modell (per_package)Per-package model (per_package)

Ist Ihr Konto auf Paketpreis eingestellt, senden Sie dieselbe Struktur — aber ohne Maße/Gewicht. Jeder Eintrag in items[] zählt als ein Paket. Koordinaten beeinflussen den Preis nicht, werden aber empfohlen: PackLast berechnet daraus die Streckenentfernung und speichert sie am Auftrag. Fehlen Koordinaten, wird die Entfernung mit 0 gespeichert (die Bestellung wird trotzdem erstellt). Siehe Preismodelle. If your account is on Paketpreis, send the same structure but without sizes/weight. Each entry in items[] counts as one package. Coordinates don't affect the price but are recommended: PackLast computes the route distance from them and stores it on the order. If coordinates are missing, the distance is saved as 0 (the order is still created). See Pricing models.

Beispiel-Request — Paketpreis (JSON)Sample request — per-package (JSON)

{
  "parcels": [
    {
      "pickup_address": "Lager 1, Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "items": [
        { "item_name": "Paket" },
        { "item_name": "Paket" },
        { "item_name": "Paket" }
      ]
    },
    {
      "pickup_address": "Lager 1, Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Hauptstr. 1, 10827 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.4849", "delivery_long": "13.3520",
      "items": [ { "item_name": "Paket" } ]
    }
  ]
}

Koordinaten optional (Preis unverändert), aber empfohlen — daraus wird die Entfernung berechnet und am Auftrag gespeichert.Coordinates optional (price unchanged) but recommended — the route distance is computed from them and stored on the order.

Beispiel-Antwort — PaketpreisExample response — per-package 200

{
  "success": true,
  "total_weight": 0,
  "total_distance": [7.96, 15.72],
  "price": {
    "currency": "EUR",
    "pricing_model": "per_package",
    "subtotal": 20.00,
    "tax_percentage": 0,
    "tax_amount": 0,
    "total_amount": 20.00,
    "breakdown": {
      "pricing_model": "per_package",
      "package_price": 0,
      "number_of_packages": 4,
      "total_package_charge": 0,
      "delivery_price": 10.00,
      "number_of_deliveries": 2,
      "total_delivery_charge": 20.00,
      "pickup_price": 0,
      "number_of_pickups": 1,
      "total_pickup_charge": 0,
      "discount": 0
    }
  },
  "calculate_signature": "9f1c…"
}

Beispiel: 4 Pakete an 2 Lieferadressen, Modell „pro Lieferadresse" zu 10 € → 2 × 10 € = 20 € netto. Bei „pro Paket" zu 10 € wären es 4 × 10 € = 40 €. Der Abholpreis fällt nur ab der zweiten Abholadresse an. Example: 4 packages to 2 delivery addresses, model "per delivery address" at €10 → 2 × €10 = €20 net. With "per package" at €10 it would be 4 × €10 = €40. The pickup price only applies from the second pickup address onward.

Bestellung erstellenCreate order

POST /partner/order-save

Erstellt die Bestellung. Senden Sie dieselben Pakete wie bei der Berechnung, die calculate_signature sowie die Kontaktdaten für Abholung und Zustellung. Creates the order. Send the same parcels you quoted, the calculate_signature, plus pickup and delivery contact details.

Zusätzliche Felder (zur Berechnung)Additional fields (beyond Calculate)

FeldTypBeschreibung
calculate_signature erforderlichstringAus der Berechnungs-Antwort.
parcels[].pickup_name erforderlichstringKontaktname Abholung.
parcels[].pickup_contact_number erforderlichstringTelefon Abholung.
parcels[].delivery_name erforderlichstringEmpfängername.
parcels[].delivery_contact_number erforderlichstringTelefon Empfänger.
parcels[].pickup_description, delivery_description, pickup_instruction, delivery_instruction optionalstringHinweise für den Fahrer.
FieldTypeDescription
calculate_signature requiredstringFrom the Calculate response.
parcels[].pickup_name requiredstringPickup contact name.
parcels[].pickup_contact_number requiredstringPickup phone.
parcels[].delivery_name requiredstringRecipient name.
parcels[].delivery_contact_number requiredstringRecipient phone.
parcels[].pickup_description, delivery_description, pickup_instruction, delivery_instruction optionalstringNotes for the driver.

Nicht senden: Gesamtgewicht, Artikel-/Routen-Flags, Stadt und Zahlungsart werden automatisch bestimmt. Partneraufträge werden immer über Ihr Abrechnungskonto („online") abgerechnet. Do not send: combined weight, item/route flags, city and payment method are determined automatically. Partner orders are always billed to your account ("online").

Beispiel-RequestExample request

curl https://app.packlast.de/api/partner/order-save \
  -H "Authorization: Bearer pk_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "calculate_signature": "e7a1bdb2ebf09715c0fc11f792b6dc225c08f93c3c64dbff8bbb243c7e748a14",
    "parcels": [
      {
        "pickup_address": "Alexanderplatz 1, 10178 Berlin",
        "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
        "pickup_lat": "52.5219", "pickup_long": "13.4132",
        "delivery_lat": "52.5033", "delivery_long": "13.3289",
        "pickup_name": "Max Mustermann", "pickup_contact_number": "+49301234567",
        "delivery_name": "Erika Musterfrau", "delivery_contact_number": "+49307654321",
        "delivery_description": "Leave at reception",
        "items": [
          { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
        ]
      }
    ]
  }'

Beispiel-Request — eine Route, ein Artikel (JSON)Sample request — single route, one item (JSON)

{
  "calculate_signature": "<aus der Calculate-Antwort / from the Calculate response>",
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "pickup_name": "Max Mustermann", "pickup_contact_number": "+49301234567",
      "delivery_name": "Erika Musterfrau", "delivery_contact_number": "+49307654321",
      "delivery_description": "Leave at reception",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
      ]
    }
  ]
}

Beispiel-Request — eine Route, mehrere Artikel (JSON)Sample request — single route, multiple items (JSON)

{
  "calculate_signature": "<aus der Calculate-Antwort / from the Calculate response>",
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "pickup_name": "Max Mustermann", "pickup_contact_number": "+49301234567",
      "delivery_name": "Erika Musterfrau", "delivery_contact_number": "+49307654321",
      "delivery_description": "Leave at reception",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" },
        { "length": 20, "breadth": 15, "height": 10, "weight": 4.0, "item_name": "Paket" }
      ]
    }
  ]
}

Beispiel-Request — mehrere Routen, mehrere Artikel (JSON)Sample request — multiple routes, multiple items (JSON)

{
  "calculate_signature": "<aus der Calculate-Antwort / from the Calculate response>",
  "parcels": [
    {
      "pickup_address": "Alexanderplatz 1, 10178 Berlin",
      "delivery_address": "Kurfürstendamm 21, 10719 Berlin",
      "pickup_lat": "52.5219", "pickup_long": "13.4132",
      "delivery_lat": "52.5033", "delivery_long": "13.3289",
      "pickup_name": "Max Mustermann", "pickup_contact_number": "+49301234567",
      "delivery_name": "Erika Musterfrau", "delivery_contact_number": "+49307654321",
      "items": [
        { "length": 30, "breadth": 20, "height": 15, "weight": 5.0, "item_name": "Karton" }
      ]
    },
    {
      "pickup_address": "Warschauer Str. 70, 10243 Berlin",
      "delivery_address": "Hauptstr. 1, 10827 Berlin",
      "pickup_lat": "52.5053", "pickup_long": "13.4490",
      "delivery_lat": "52.4849", "delivery_long": "13.3520",
      "pickup_name": "Lena Weber", "pickup_contact_number": "+49303333333",
      "delivery_name": "Tom Fischer", "delivery_contact_number": "+49304444444",
      "items": [
        { "length": 25, "breadth": 25, "height": 25, "weight": 8.0, "item_name": "Box A" },
        { "length": 20, "breadth": 15, "height": 10, "weight": 4.0, "item_name": "Box B" }
      ]
    }
  ]
}

Verwenden Sie dieselben Pakete (Adressen, Artikel, Gewichte) wie bei der Berechnung und fügen Sie die calculate_signature sowie die Kontaktdaten hinzu. Bei Abweichung der preisrelevanten Felder folgt 409. Use the same parcels (addresses, items, weights) you quoted and add the calculate_signature plus contact details. If a price-relevant field differs you get a 409.

Beispiel-AntwortExample response 200 (eine Route)(single route)

{
  "success": true,
  "status": "order created",
  "parent_order_id": 1369
}

parent_order_id ist die PackLast-Auftragsnummer. Der Auftrag erscheint in Ihrem Konto unter Meine Bestellungen und wird Ihrer Abrechnung hinzugefügt. parent_order_id is the PackLast order id. The order appears in your account under Meine Bestellungen and is added to your billing.

Bestellungen mit mehreren RoutenMulti-route orders

Für mehrere Stopps in einem Auftrag senden Sie mehrere Pakete. Jedes Paket wird zu einer eigenen Route mit eigener Abholung, Zustellung, Kontakten und Artikeln. PackLast erstellt einen Hauptauftrag plus einen Unterauftrag je Route und erfasst eine einzige Belastung für den gesamten Auftrag. Ein Paket darf auch mehrere Artikel enthalten. To book several stops in one order, send multiple parcels. Each becomes its own route with its own pickup, delivery, contacts and items. PackLast creates one parent order plus one child order per route, and records a single charge for the whole order. A parcel may contain multiple items.

Beispiel-AntwortExample response 200 (mehrere Routen)(multi route)

{
  "success": true,
  "status": "order created",
  "parent_order_id": 1370,
  "orders": [
    { "order_id": 1371, "status": "pending", "sequence": 1 },
    { "order_id": 1372, "status": "pending", "sequence": 2 }
  ]
}

Mehrere Routen werden automatisch erkannt, sobald parcels mehr als einen Eintrag enthält. Die berechneten Pakete (Adressen/Artikel) müssen zwischen Berechnung und Erstellung exakt übereinstimmen, sonst 409. Multi-route is detected automatically when parcels has more than one entry. The quoted parcels (addresses/items) must match exactly between Calculate and Create order, or you get a 409.

Feld-ReferenzField reference

Paket-ObjektParcel object

FeldTypHinweise
pickup_address / delivery_addressstringVollständige Adresse (min. 5 Zeichen). Signiert.
pickup_lat/long, delivery_lat/longstring|numberKoordinaten. PackLast berechnet die Entfernung (Standard-Modell) serverseitig daraus.
pickup_name / delivery_namestringKontaktname. Beim Erstellen erforderlich.
pickup_contact_number / delivery_contact_numberstringTelefon. Beim Erstellen erforderlich.
total_weightnumberNicht senden. Wird aus den Artikelgewichten berechnet und in der Calculate-Antwort zurückgegeben.
items[]arrayEin oder mehrere Artikel.
FieldTypeNotes
pickup_address / delivery_addressstringFull address (min 5 chars). Signed.
pickup_lat/long, delivery_lat/longstring|numberCoordinates. PackLast computes the distance (Standard model) server-side from these.
pickup_name / delivery_namestringContact name. Required at order time.
pickup_contact_number / delivery_contact_numberstringPhone. Required at order time.
total_weightnumberDo not send. Computed from the item weights and returned in the Calculate response.
items[]arrayOne or more items.

Artikel-ObjektItem object

FeldTypHinweise
length / breadth / heightnumberMaße in cm (min. 1). Nur Standard-Modell (size_based) — erforderlich & signiert. Beim Paketpreis-Modell weglassen (wird ignoriert).
weightnumberArtikelgewicht (kg, min. 0,1). Nur Standard-Modell — erforderlich & signiert. Beim Paketpreis-Modell weglassen.
item_namestringBezeichnung auf dem Auftrag (z. B. „Karton"). Beim Paketpreis-Modell zählt jeder items[]-Eintrag als ein Paket.
FieldTypeNotes
length / breadth / heightnumberDimensions in cm (min 1). Standard model only (size_based) — required & signed. Omit for the per-package model (ignored).
weightnumberItem weight (kg, min 0.1). Standard model only — required & signed. Omit for the per-package model.
item_namestringLabel shown on the order (e.g. "Karton"). In the per-package model each items[] entry counts as one package.

API-SchlüsselAPI keys

API-Schlüssel verwalten Sie nach Anmeldung in Ihrem Konto unter web.packlast.de (Bereich API-Schlüssel): erzeugen, Status prüfen und widerrufen. Das Erzeugen eines neuen Schlüssels ersetzt den vorhandenen. Der Schlüssel wird nur einmal angezeigt und nur als Hash gespeichert. Manage API keys by logging in to your account at web.packlast.de (the API-Schlüssel section): generate, check status, and revoke. Generating a new key replaces the existing one. The key is shown only once and stored only as a hash.

Voraussetzung: Der Schlüssel kann erst nach Vertragsunterschrift, Freischaltung und (falls festgelegt) Hinterlegung der Kaution erzeugt werden. Andernfalls antwortet die Erzeugung mit 403 (nicht freigeschaltet) bzw. 402 (Kaution offen). Prerequisite: the key can only be generated after the contract is signed, the account is approved and (if set) the deposit is paid. Otherwise generation returns 403 (not approved) or 402 (deposit due).

Kaution (Sicherheitsleistung)Security deposit

PackLast kann je Geschäftskunde eine Kaution festlegen (auch 0 €). Ist eine Kaution festgelegt, hinterlegen Sie diese vor der Aktivierung unter Wallet (Kreditkarte/SEPA via Stripe). Die Kaution wird innerhalb von 14 Tagen nach Vertragsende zurückerstattet, abzüglich offener Beträge. Bei 0 € entfällt dieser Schritt. PackLast may set a security deposit per business customer (including €0). If set, you pay it before activation under Wallet (credit card/SEPA via Stripe). It is refunded within 14 days after the contract ends, minus any outstanding amounts. At €0 this step is skipped.

Abrechnung & RechnungenBilling & invoices

Aufträge eines aktivierten Geschäftskunden werden nicht pro Auftrag bezahlt, sondern netto erfasst und gemäß Ihrem Abrechnungszyklus (wöchentlich, zweiwöchentlich, monatlich) automatisch zu einer Rechnung zusammengefasst — zzgl. 19 % MwSt. und mit Ihrer USt-IdNr. Rechnungen sehen und bezahlen Sie unter web.packlast.de (Bereich Rechnungen) per Kreditkarte/SEPA (Stripe) oder PayPal. Orders from an activated business customer are not paid per order; they are recorded net and automatically grouped into an invoice on your billing cycle (weekly, bi-weekly, monthly) — plus 19% VAT and with your VAT ID. View and pay invoices at web.packlast.de (the Rechnungen section) via credit card/SEPA (Stripe) or PayPal.

Zahlungsverzug: Ist eine Rechnung mehr als 2 Tage überfällig, wird Ihr Konto vorübergehend gesperrt und der offene Betrag von der Kaution einbehalten. Übersteigt der offene Betrag die Kaution, ist der Restbetrag innerhalb von 7 Tagen zu zahlen. Ein gesperrtes Konto liefert bei order-save eine 402/403-Antwort, bis der Rückstand ausgeglichen ist. Overdue: if an invoice is more than 2 days overdue, your account is temporarily blocked and the amount due is deducted from the deposit. If the amount exceeds the deposit, the remainder must be paid within 7 days. While blocked, order-save returns 402/403 until the balance is cleared.

Vor der Aktivierung: Bis Vertrag + Freischaltung (+ ggf. Kaution) abgeschlossen sind, bestellen Sie wie ein normaler Kunde mit Zahlung pro Auftrag (inkl. MwSt.). Diese Aufträge erscheinen nicht auf der Sammelrechnung. Before activation: until the contract + approval (+ deposit if set) are complete, you order like a normal customer with payment per order (incl. VAT). Those orders are not added to the periodic invoice.

Support

Fragen zur Integration oder Abrechnung? Kontaktieren Sie Ihren PackLast-Ansprechpartner oder support@packlast.de. Questions about integration or billing? Contact your PackLast account manager or support@packlast.de.

Rechtliches: Die Nutzung der Partner-API und aller PackLast-Dienste unterliegt unseren Allgemeinen Geschäftsbedingungen (AGB). Weitere Informationen finden Sie in unseren AGB sowie in der Datenschutzerklärung und im Impressum. Legal: Use of the Partner API and all PackLast services is subject to our Terms & Conditions (AGB). For more information see our AGB as well as the Privacy Policy and Imprint.