Öffentliche / Partner-Dokumentation Diese Version richtet sich an Kunden und Partner zur API-Integration. Einige Abschnitte für Administratoren (Benutzerverwaltung, Tarife, Infrastrukturdetails) sind nicht enthalten.

Basis-URL und Umgebungen

Endpunkte sind versioniert unter /api/v1. Immer HTTPS verwenden.

Umgebung Basis-URL Hinweise
Produktion https://flow.icarry.it Verbunden mit echter Flotte und von iCarryUP geplanten Jobs.

In dieser Partner-Version werden keine Links zu Swagger/ReDoc angezeigt. Der Zugriff auf /api/docs, /api/redoc und /openapi.json ist nur Superadmins vorbehalten (andere Konten erhalten 403). Für Partner ist die Endpoint-Liste auf dieser Seite die Referenz.

Authentifizierung

Die API verwendet JWT-Tokens mit Bearer. Erhalten Sie das Token durch Senden von Anmeldedaten an den OAuth2-Token-Endpunkt.

POST /api/v1/auth/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=OPS_USER&password=********

Das zurückgegebene Token muss im Header gesendet werden:

Authorization: Bearer <ACCESS_TOKEN>

⚠️ Setzen Sie server-seitige Token-Rotation alle 24h oder geplantes Refresh. Für Server-zu-Server-Integrationen erstellen Sie dedizierte technische Benutzer (Rolle: system).

Empfohlener Workflow

  1. Laden Sie Logistikdaten (Fahrer + Lieferungen) im erwarteten Format von RoutingOptimizationRequest.
  2. Senden Sie POST /api/v1/routing/optimize mit async_processing=true; erhalten Sie eine job_id.
  3. Überwachen Sie den Status via GET /api/v1/routing/jobs/{job_id} (Polling 5-10s) oder via WebSocket /ws/jobs.
  4. Bei status=completed lesen Sie result, exportieren Sie Dateien oder generieren Sie Karten mit dedizierten Endpunkten.
  5. Optional: Setzen Sie webhook_url in der Anfrage für Push-Callbacks (Payload identisch mit result).

Kritische Endpunkte

POST /api/v1/routing/optimize

Übermittelt eine neue Optimierung. Unterstützt moderne und Legacy-Payloads (automatische Konvertierung von lat/lng zu start_lat, etc.).

{
  "async_processing": true,
  "session_id": "tms-session-example-001",
  "webhook_url": "https://your-tms.example.com/webhooks/routing",
  "delivery_points": [
    {
      "tracking_number": "SHIP-EXAMPLE-0001",
      "delivery_company": "Example SpA",
      "address": "Via Esempio 1, Milano",
      "lat": 45.4642,
      "lng": 9.1900,
      "tot_items": 4,
      "priority": 1
    }
  ],
  "drivers": [
    {
      "name": "Driver example 01",
      "start_lat": 45.5342,
      "start_lng": 9.3265,
      "end_lat": 45.5342,
      "end_lng": 9.3265,
      "capacity": 90,
      "vehicle_type": "van_standard",
      "max_distance_km": 220
    }
  ],
  "algorithms": ["standard"],
  "optimization_objective": "time",
  "optimization_params": {
    "max_iterations": 120,
    "time_limit_seconds": 420,
    
    "distance_weight": 0.5,
    "time_weight": 0.3,
    "balance_weight": 0.2
    
  },
  "constraints": {
    "max_route_distance": 250,
    "max_route_duration": 480,
    "max_stops_per_route": 45
  }
}

Sofortige Antwort:

{
  "job_id": "6b758bee-65e5-473e-add8-8cecc36f6fda",
  "status": "queued",
  "estimated_completion": "2025-11-26T09:11:37.123Z",
  "result_url": "/api/v1/routing/jobs/6b758bee-65e5-473e-add8-8cecc36f6fda"
}

GEL (Locker-Abholung): Hat der Benutzer nicht die Plan-Feature gel_proximity (Tenant mit GEL auf Karte + Flag in Tier/Profil), entfernt das Backend still pickup_point_id aus Lieferungen und gel_cost_to_time_equivalent_minutes_per_eur aus optimization_params vor der Optimierung.

Welches Ziel senden

Dieselben vier Werte wie im Konsolen-Assistenten. Das Feld ist optimization_objective bei POST /api/v1/routing/optimize. Standard ist time. Ein unbekannter Wert wird als time behandelt. Sie existieren, weil eine einzige Zahl nicht zugleich die kürzeste, die pünktlichste und die günstigste Tour sein kann.

Weniger Zeit time

WarumOhne dieses Ziel kann eine kilometerkurze Tour Empfänger warten lassen. Wartezeit wird bestraft und Zeitfenster werden gefüllt.

WannNutzen bei SLA, engen Zeitfenstern oder zugesagten Ankunftszeiten.

Weniger km distance

WarumWenn Kilometer zählen, nicht die Uhr. Wartezeit wird nicht bestraft.

WannNutzen wenn Kraftstoff und Maut dominieren, Stopps weit auseinander liegen oder Zeitfenster selten sind.

Ausgewogen balanced

WarumKompromiss zwischen Zeit und Kilometern, ohne ein Extrem zu erzwingen.

WannNutzen bei gemischter Flotte oder einem normalen Tag.

Weniger Kosten cost

WarumRechnet Kilometer und Stunden in Euro um, mit den Fahrerfeldern hourly_cost, fuel_consumption, prezzo_litro und costo_pedaggio_km.

WannNutzen für ein Flottenbudget oder einen Kostenvergleich. budget_max_eur in optimization_params ist die Obergrenze, nicht dieses Ziel.

Das ist nicht balance_options: das verteilt die Last auf die Fahrer (ähnliche Stoppzahl, km oder Minuten). Die Gewichte distance_weight, time_weight und balance_weight in optimization_params sind Feintuning; für die Integration reicht optimization_objective.

{
  "optimization_objective": "time"
}

Ersetzen Sie time durch distance, balanced oder cost. Die übrigen Felder der Optimize-Anfrage bleiben wie im Beispiel.

GET /api/v1/routing/jobs/{job_id}

Gibt Status, Fortschritt und bei Abschluss die vollständige RoutingResultResponse (Routen, Geometrien, globale Metriken) zurück. Ergebnisse werden in gemeinsamem Cache persistiert und während geplanter Wartung gelöscht.

Im abgeschlossenen Ergebnis kann savings_report enthalten sein: geschätzte Einsparung (km/Zeit/Kosten) gegenüber einer Nearest-Neighbor-Baseline desselben Jobs.

GET /api/v1/routing/jobs

Listet die letzten Jobs des Benutzers. Akzeptiert ?limit=50 und ?status=processing/completed... für operative Dashboards.

DELETE /api/v1/routing/jobs/{job_id}

Bricht Jobs in Warteschlange oder Ausführung ab. Gibt 400 zurück wenn Job bereits abgeschlossen.

GET /api/v1/routing/eta

Schätzt die Wall-Clock-Dauer der Optimierung (Sekunden) aus ähnlichen historischen Runs (P50/OLS) oder dem TSP-Budget. Typische Query-Parameter: deliveries, drivers, algorithm, routing_provider, has_time_windows, pickup_count, optimization_objective.

GET /api/v1/routing/history

Persistente Optimierungshistorie für Benutzer/Tenant (Simulationen optional ausgeschlossen). Unterstützt q= zur Suche nach Name oder job_id. Nützlich für Dashboards und Audit.

GET /api/v1/routing/calendar

Kalenderereignisse (geplante Runs und Entwürfe) für einen Datumsbereich. Speist die Kalenderansicht der Konsole.

GET /api/v1/routing/status

Angereicherter Health-Check (aktive Jobs, Version, Uptime). Kann für Monitoring-Systeme oder Readiness-Probes verwendet werden.

Das Feld algorithms_available ist Administratorkonten vorbehalten; für alle anderen ist es immer ein leeres Array.

POST /api/v1/routing/simulate

Startet eine What-if-Simulation (Control Tower) aus einem Baseline-Job. Gibt eine simulation_id zurück; das Ergebnis ist ein Optimierungsjob mit is_simulation=true.

{
  "baseline_job_id": "6b758bee-65e5-473e-add8-8cecc36f6fda",
  "baseline_scope": "PLANNED",
  "simulation_mode": "reoptimize",
  "patches": [
    {
      "type": "add_delivery",
      "point_type": "delivery",
      "lat": 41.9028,
      "lng": 12.4964,
      "tracking_number": "NEW-001",
      "pickup_point_id": "HUB-1"
    },
    { "type": "remove_delivery", "tracking_number": "OLD-042" }
  ]
}

Unterstützte Patches: add_delivery (auch Abholung mit point_type=pickup und pickup_point_id), remove_delivery, add_driver, remove_driver, delivery_time_window, balance_options, invalidate_matrices. baseline_scope=PLANNED (LIVE in v1 nicht unterstützt).

GET /api/v1/routing/simulations/{simulation_id}

Gibt Metadaten und Vergleich der Simulation zurück (Baseline vs What-if-Ergebnis).

POST /api/v1/routing/estimate-workload

Schätzt den Arbeitsbedarf (Minuten/Fahrer) vor der Flottenwahl. mode=quick (schnelle Heuristik) oder precise (Solver mit virtueller Flotte).

GET /api/v1/routing/delivery-execution/summary

KPI zur Lieferausführung (z. B. Pünktlichkeit %) aggregiert über die letzten Jobs des Benutzers.

GET /api/v1/routing/jobs/{job_id}/delivery-execution

Detail der Lieferausführung und Proof of Delivery (POD) für einen einzelnen Job.

POST /api/v1/routing/manual-assignments

Ermöglicht Lieferungen → Fahrer vor dem Start der Optimierung festzulegen. GET/DELETE /manual-assignments Endpunkte ermöglichen Lesen/Zurücksetzen von Präferenzen.

POST /api/v1/routing/jobs/{job_id}/generate-real-map

Erstellt persistente HTML-Karten (Ordner web/static/maps) bereit für die Verteilung an Fahrer. GET .../download-map und GET .../export generieren Karten bzw. Excel.

POST /api/v1/routing/jobs/{job_id}/generate-geometries

Erzeugt Straßen-Geometrien für einen abgeschlossenen Job (JWT erforderlich). Optionaler If-Match-Header mit routes_version_hash; Abweichung → 409 routes_version_mismatch — ohne Header erneut versuchen (Geometrien kommen aus dem gespeicherten Job).

GET /api/v1/routing/driver-maps

Listet Fahrerkarten des aktuellen Tenants (JWT erforderlich; 401 ohne Token). Superuser ohne Impersonation kann alle Tenants sehen.

Geocoding (authentifiziert)

JWT erforderlich. POST /optimize geokodiert nicht: numerische lat/lng im JSON bleiben Pflicht. Diese Endpunkte zuerst aufrufen. source ist ein Diagnose-Label, kein Vertrag.

POST /api/v1/geocoding/lookup

Nur Cache, höchstens 500 Adressen. hit false = nicht im Cache (forward nutzen). Startet keine externe Auflösung.

{
  "addresses": ["Via Roma 1, Milano", "Piazza Duomo, Firenze"]
}
{
  "results": [
    { "index": 0, "hit": true, "lat": 45.46, "lng": 9.19, "source": "…", "low_confidence": false, "cache_id": 12 },
    { "index": 1, "hit": false, "lat": null, "lng": null, "source": null, "low_confidence": null, "cache_id": null }
  ]
}

POST /api/v1/geocoding/forward

Löst bis zu 10 Adressen (raw + query). origin: api (Standard), wizard, mobile, one_driver, simulator, rubrica. Budget etwa 25 Sekunden. status: ok, not_found, pending (denselben Aufruf wiederholen), error.

{
  "origin": "api",
  "items": [{ "raw": "Via Roma 1, Milano", "query": "Via Roma 1, Milano" }]
}
{
  "results": [
    {
      "status": "ok",
      "lat": 45.46,
      "lng": 9.19,
      "confidence": 90,
      "matched": true,
      "low_confidence": false,
      "source": "…",
      "cache_id": 12
    }
  ]
}

GET /api/geocode_address?address=

Eine Adresse, derselbe Resolver wie forward. 200 mit lat/lng; 400 wenn address fehlt; 404 ohne Treffer; 503 wenn die Auflösung noch pending ist.

GET /api/reverse_geocode?lat=&lng=

Koordinaten zu Adresse. 200 { address, source }; 400 wenn lat oder lng fehlt; 404 ohne Treffer.

Koordinaten-Pins Enterprise

Enterprise: Adressen und Koordinaten speichern. Tenant-Pins haben Vorrang bei Lookup/Forward. Optionale Auto-Erfassung aus POST /optimize.

POST /api/v1/geocoding/pins

Upsert bis 500 Pins. Gleiche Rolle wie DELETE und PUT settings: Owner, Admin oder Superuser, plus Feature geocode_pins. Ein Member erhält 403 owner_or_admin_required. Jedes results-Element hat index, status, pin_id, address_key, error.

status: created (neu), updated (gleiche Adresse, Koordinaten um mindestens 5 m verschoben), unchanged (Verschiebung unter 5 m), rejected (error: invalid_address, invalid_coordinates, zero_coordinates, swapped_lat_lng, out_of_area), limit_reached (Pin-Limit des Tenants). summary zählt dieselben Werte.

address_key nutzt dieselbe Normalisierung wie Lookup und Forward: Unicode NFKC, Kleinbuchstaben, zusammengezogene Leerzeichen, Kommas als „, “, führende und nachgestellte Leerzeichen und Kommas entfernt, maximal 500 Zeichen. Dieselbe Zeichenkette bei POST und Lookup findet den Pin: den zurückgegebenen Wert verwenden. Hausnummer, PLZ oder zusätzliche Wörter ändern den Schlüssel; Großschreibung und doppelte Leerzeichen nicht.

{
  "items": [
    { "address": "Via Roma 1, 20121 Milano MI", "lat": 45.46, "lng": 9.19, "external_id": "CLI-1" }
  ]
}
{
  "results": [
    { "index": 0, "status": "created", "pin_id": 12, "address_key": "via roma 1, 20121 milano mi", "error": null }
  ],
  "summary": { "created": 1, "updated": 0, "unchanged": 0, "rejected": 0, "limit_reached": 0 }
}

GET /api/v1/geocoding/pins

Pin-Liste für alle mit dem Feature (q ab 3 Zeichen, external_id, limit, after_id).

DELETE /api/v1/geocoding/pins/{pin_id}

Pin im eigenen Tenant löschen. Nur Owner, Admin oder Superuser. Der Pin eines anderen Tenants liefert 404.

GET / PUT /api/v1/geocoding/pins/settings

GET (Feature): enabled, auto_capture, count, max_pins. PUT (Owner/Admin): Pflichtkörper { "auto_capture": true|false }. PUT-Antwort: enabled, auto_capture, max_pins.

{ "auto_capture": true }

Excel-Export (authentifiziert)

POST /api/v1/routing/export-geocoded-deliveries

Erfordert Authorization Bearer. Liefert eine Excel-Datei aus dem gesendeten Payload.

POST /api/v1/routing/export-geocoded-drivers

Erfordert Authorization Bearer. Liefert eine Excel-Datei aus dem gesendeten Payload.

POST /api/v1/routing/export-manual-drivers

Erfordert Authorization Bearer. Liefert eine Excel-Datei aus dem gesendeten Payload.

POST /api/v1/routing/export-manual-deliveries

Erfordert Authorization Bearer. Liefert eine Excel-Datei aus dem gesendeten Payload.

POST /api/v1/routing/export-manual-pickups

Erfordert Authorization Bearer. Liefert eine Excel-Datei aus dem gesendeten Payload.

Öffentliche / Bootstrap-Endpunkte

GET /api/v1/public/features

Liefert Frontend-Flags: gel_proximity_enabled, rlp_bryntum_timeline_enabled und PostHog-Bootstrap (posthog_enabled, posthog_host, posthog_project_api_key, posthog_session_replay, posthog_unmask_replay). Bearer optional: ohne Token ist GEL false; mit Token werden Tenant und Tier ausgewertet. Ist PostHog deaktiviert oder unvollständig, ist posthog_enabled false und der Project Key wird nicht exponiert.

GET /api/v1/public/fuel-prices

Kraftstoff- und Energie-Durchschnitte, ohne Authentifizierung. Keine iCarry-Zeitreihe: aktueller Snapshot von MIMIT (tägliche Italien- und Regionalmittel) plus LNG/HVO aus Anlagen und monatliche öffentliche AC/DC-Ladung. Für UI und Kostenschätzungen, nicht für Abrechnung, ohne SLA auf Drittquellen. Nicht das Routenfeld prezzo_litro.

Cache-Control public, max-age=1800: dieses TTL beim Polling einhalten. national und regions: Diesel, Benzin und LPG in €/L, Methan in €/kg (regions[].name ist der MIMIT-Regionsname, z. B. Lombardia). extended.gnl (eur_kg), hvo (eur_l), electric_ac/electric_dc (eur_kwh) mit value, unit, updated, source. Wenn alle Quellen fehlschlagen: {"available": false}. Der GME-PUN ist nicht enthalten. Das JSON-Beispiel zeigt die Form, keine Live-Werte.

{
  "available": true,
  "source": "MIMIT",
  "updated": "21/09/2026",
  "national": { "gasolio": 1.623, "benzina": 1.712, "gpl": 0.741, "metano": 1.401 },
  "regions": [{ "name": "Lombardia", "gasolio": 1.631, "benzina": 1.720, "gpl": 0.738, "metano": 1.390 }],
  "extended": {
    "gnl": { "value": 1.452, "unit": "eur_kg", "source": "mimit_impianti" },
    "hvo": { "value": 1.890, "unit": "eur_l", "source": "mimit_impianti" },
    "electric_ac": { "value": 0.62, "unit": "eur_kwh", "source": "adiconsum_mensile" }
  }
}

Der Endpunkt für GEL-Abholpunkte auf der Karte ist nicht Teil dieser öffentlichen Partner-Dokumentation. Er steht in der internen Superadmin-Dokumentation und wird bei Bedarf bei Verträgen mit Locker-Integration bereitgestellt. Kontaktieren Sie den Support.

Eingabedaten-Wörterbuch (Excel/CSV ↔ JSON)

Offizielle Vorlagenspalten entsprechen den Feldern von POST /api/v1/routing/optimize. Leere Vorlagen herunterladen, dann geokodiertes JSON senden. Die Spaltenreihenfolge ist in den Liefer- und Fahrervorlagen definiert.

Vorlagen: GET /api/v1/templates/delivery-template und GET /api/v1/templates/driver-template (XLSX/CSV). Kein separater Pickup-Download — Lieferblatt mit point_type=pickup verwenden.

In Excel können lat/lng fehlen, wenn die Adresse geokodierbar ist. POST /optimize erfordert immer numerische lat/lng (und start_lat/start_lng für Fahrer).

POST /api/v1/files/upload ist nur Speicherung: kein Spalten-Parsing und keine Optimierung. Partner-API-Integration ist JSON an /optimize.

Lieferungen / Stopps (delivery_points[])

Excel JSON /optimize Pflicht Typ Zweck
tracking_numbertracking_numberjaString ≤64Stopp-ID
delivery_addressaddressja (oder lat+lng)StringGeokodierung / Anzeige
delivery_companydelivery_companyja in JSON (Import-Standard „Cliente“)StringMetadaten
lat / lnglat / lngja in JSON; optional in Excel bei AdresseGradMatrix / Geometrie
tot_itemstot_itemsnein (Standard 1)int ≥1Kapazität (Kolli)
priorityprioritynein (Standard 1)1–10 (1 = hoch)Priorität / Drop
estimated_durationestimated_durationneinMinutenServicezeit am Stopp
notesnotesneinString ≤500Nur Fahrer-App
phonephoneneinE.164 (+ und Ziffern, z. B. +393331234567)Empfängertelefon (tel-Link in App und Control Tower)
preassigned_driverpreassigned_driverneindrivers[].nameLock → mandatory_assignments
point_typepoint_typenein (Standard delivery)pickup | deliveryReihenfolge Abholung→Lieferung; Abholung ohne Verknüpfung = eigenständige Haltestelle
pickup_point_idpickup_point_idneinStringVerknüpfung Lieferung→Abholung; ohne Verknüpfung Rückkehr zum Ankunftspunkt
time_window_start / endgleichneinHH:MMZeitfenster
volume_m3 / weight_kggleichneinfloat ≥0Volumengrenze (Gewicht → 0.001 m³ ohne Volumen)

Nur JSON (Stopp): optionales id (sonst tracking_number oder generierte UUID).

Ein point_type=pickup ohne verknüpfte Lieferung wird nicht verworfen: er ist eine Pflicht-Haltestelle und die Ware kehrt zum Ankunftspunkt des Fahrers zurück. Die Antwort setzt pickup_mode=return_to_depot und eine Zeile in warnings. Nicht planbare Abholungen stehen in unassigned_deliveries.

Fahrer / Fahrzeuge (drivers[])

Excel JSON /optimize Pflicht Hinweise
namenamejaIdentität
phonephoneneinOptionales Fahrertelefon in E.164
start_address / end_address—start beim Import PflichtGeokodierung → start_* / end_*
lat / lngstart_lat / start_lngja in JSONStartdepot
end_lat / end_lngend_lat / end_lngja in JSON (Standard = start)Rückkehrdepot
capacitycapacitynein (Standard 50)Max. Kolli (tot_items)
max_volume_m3max_volume_m3neinVolumenkapazität
vehicle_typevehicle_typenein (Standard car)Vollständige Liste unten: car, van, van_standard, van_maxi, truck, truck_7_5t, truck_12t, truck_18t, truck_32t, artic_44t, bike, scooter, icarry_cargo_bike
routing_profilerouting_profileneinOverride: car, van_standard, van_maxi, truck_7_5t, truck_12t, truck_18t, truck_32t, artic_44t, icarry_cargo_bike
max_distance_kmmax_distance_kmneinMax. km
hourly_cost, fuel_consumption, prezzo_litro, costo_pedaggio_kmgleichneinKosten / Reports
start_time / end_timegleichnein (08:00–18:00 bei Paar)Schicht
break_start / break_endgleichals PaarPause
max_minutesmax_minutesneinMax. Dauer (aus Schicht−Pause ableitbar)

Nur JSON (Fahrer): optionales id, active (Standard true), max_overtime_minutes (Standard 0).

Zulässige Fahrzeugtypen (vollständige Liste)

Ein Slug senden, kein Handelsmodell. Standard vehicle_type=car. 4x4 oder Aufbau haben keinen eigenen Slug.

API-Slug Kategorie Wann verwenden
carPkw (M1)Standard-Pkw.
van AliasTransporter (N1)Gleich wie van_standard.
van_standardTransporter (N1)Kompakter Transporter bis 2,5 t, Höhe ca. 1,9 m.
van_maxiTransporter (N1)Hochdach-Transporter bis 3,5 t, Höhe ca. 2,7 m.
truck AliasLkwGleich wie truck_7_5t.
truck_7_5tLkwLeichter Stadt-Lkw, zGG 7,5 t.
truck_12tLkwMittlerer Lkw, zGG 12 t. Beispiel: Iveco TGM 13.250 4x4 → truck_12t.
truck_18tLkwSchwerer 2-Achs-Lkw, zGG 18 t.
truck_32tLkw4-Achs-Lkw, zGG 32 t.
artic_44tSattelzugSattelzug 44 t, ca. 16,5 m.
bike AliasMikrologistikGleich wie icarry_cargo_bike.
scooter AliasPkw (M1)Gleich wie car.
icarry_cargo_bikeMikrologistikLastenrad für die letzte Meile.

routing_profile muss, wenn gesetzt, ein Straßen-Slug der Tabelle sein (kein Alias van/truck/bike/scooter) und hat Vorrang vor vehicle_type.

Häufige Header-Aliase (IT/EN)

Der Dateiimport akzeptiert auch alternative Header (normalisiert, ohne Akzente). Häufige Beispiele:

Hauptdaten-Schema

DeliveryPointRequest

Pflicht in JSON: lat/lng, tracking_number (≤64), address, delivery_company. Optional: tot_items (Standard 1), priority (1–10), estimated_duration (Minuten), notes, phone (E.164, z. B. +393331234567), preassigned_driver, point_type (pickup|delivery), pickup_point_id, time_window_start/end (HH:MM), volume_m3, weight_kg, id.

Vollständige Excel↔JSON-Zuordnung: siehe „Eingabedaten-Wörterbuch“ oben.

DriverRequest

Pflicht in JSON: name, start_lat/lng, end_lat/lng (Ende standardmäßig = Start). Optional: phone (E.164), capacity (Standard 50), max_volume_m3, vehicle_type (Standard car), routing_profile, max_distance_km, Kosten, start_time/end_time, break_start/end, max_minutes, active, max_overtime_minutes, id. Nur Excel: start_address/end_address.

vehicle_type — vollständige Liste: car, van, van_standard, van_maxi, truck, truck_7_5t, truck_12t, truck_18t, truck_32t, artic_44t, bike, scooter, icarry_cargo_bike. Standard car. Keine Marke/kein Modell senden: ein Iveco TGM 13.250 4x4 ist truck_12t. Aliase: van → van_standard, truck → truck_7_5t, bike → icarry_cargo_bike, scooter → car.

routing_profile — optionaler Override. Zulässig: car, van_standard, van_maxi, truck_7_5t, truck_12t, truck_18t, truck_32t, artic_44t, icarry_cargo_bike. Fehlt er, wird er aus vehicle_type abgeleitet.

Vollständige Excel↔JSON-Zuordnung: siehe „Eingabedaten-Wörterbuch“ oben.

OptimizationParamsRequest

Gewichtet Distanz, Zeit und Lastausgleich. Werte hängen von den betrieblichen Prioritäten ab.

RoutingConstraintsRequest

Aktiviert harte Constraints (max. Dauer, max. Distanz, Stops pro Route). Ohne Angabe wendet der Motor dynamische Limits aus den Fahrern an.

Abschluss-Webhook

Setzen Sie webhook_url in der Anfrage um eine signierte POST (Header X-iCarry-Signature) mit dem gleichen Payload wie RoutingResultResponse zu erhalten. Bei Statuscode < 300 gilt als zugestellt; sonst 3 exponentielle Retries (15s, 60s, 180s).

Echtzeit via WebSocket

Verbinden Sie sich mit wss://flow.icarry.it/ws/jobs und treten Sie dem Raum job_{job_id} via Socket.IO join_room Event bei. Sie erhalten job_progress, job_completed, job_failed Events.

Support-Tools

Fehler und Best Practices

Code Szenario Wie reagieren
400 Validierungsfehler (Pydantic-Schema) Lesen Sie detail für ungültiges Feld; wenden Sie Sanitisierung auf Anruferseite an.
401 Token fehlt oder abgelaufen (auch driver-maps / Excel-Export ohne Bearer) Token regenerieren und Aufruf wiederholen.
403 algorithms-Wert nicht erlaubt (auto oder standard verwenden) Verwenden Sie auto oder standard, oder kontaktieren Sie den Support.
403 Admin-/Superuser-Endpunkt ohne Berechtigung Tenant-Admin-Endpunkte brauchen is_admin; Billing-/Algorithmus-Mutationen und Settings brauchen is_superuser.
409 Doppelter Job in Warteschlange (gleiche session_id) Verwenden Sie eindeutige Sessions für parallele Jobs.
409 routes_version_mismatch (If-Match / gleichzeitige Routenbearbeitung) Job-Hash neu laden oder generate-geometries ohne If-Match erneut versuchen.
503 Abhängigkeit nicht konfiguriert (z. B. fehlender GEL-Webhook-Token) Erforderlichen Token/Secret in Admin-Settings oder Env setzen und erneut versuchen.
500 Interner Fehler / Routing-Dienst nicht erreichbar Retry mit Backoff. Status mit /api/v1/routing/status prüfen.

Für kürzere Antwortzeiten setzen Sie Batches zwischen 80 und 120 Lieferungen pro Job; über 150 Stops erwägen Sie automatische Aufteilung (Flag allow_partial_assignments true) und nachfolgende Rekomposition.

Support

Für erweiterte Funktionen (High-Performance-Motor, Prioritäts-SLA, dedizierte Umgebungen) oder IP-Whitelisting auf Produktions-Endpunkten kontaktieren Sie [email protected] mit Ihrer client_id und der zu autorisierenden öffentlichen IP.

🚀 TMS-Integrationsleitfaden (Transport Management System)

Diese Kurzfassung beschreibt die Anbindung der iCarryUP-Routing- und Optimierungs-APIs an Ihr TMS (Server-zu-Server, ohne Web-UI). Die ausführliche italienische Version mit langen Codebeispielen finden Sie unter Italiano.

Schnellnavigation

1. Einführung

Versionierte API unter /api/v1. Typischer Ablauf: Ihr TMS sendet Fahrer und Stopps → iCarryUP optimiert → Sie pollen GET /routing/jobs/{id} oder erhalten einen Webhook auf webhook_url → Routen zurück ins TMS importieren.

2. Setup

2.1 Zugangsdaten

Technischen Benutzer anfragen bei [email protected] (Rollen, optional IP-Allowlisting).

2.2 Basis-URL

Umgebung Basis-URL Verwendung
Produktion https://flow.icarry.it Live-Betrieb

2.3 Erreichbarkeit prüfen

curl -s "https://flow.icarry.it/api/v1/routing/status"

Beispielfelder: status, version (z. B. 2.9.23-1), active_jobs, routing_service_status. Keine Auth für Erreichbarkeit nötig. Das Feld algorithms_available ist Administratorkonten vorbehalten; für alle anderen ist es immer [].

2.4 Öffentliche API & GEL-Kartenebene

GET /api/v1/public/features zeigt, ob GEL-Funktionen für Ihre Integration gelten (wie Abschnitt Öffentliche Endpunkte oben). Bearer optional; mit gültigem Token werden Tenant-Karte und gel_proximity auf Profil/Tier berücksichtigt.

Partner-Dokumentation: Der Endpunkt für GEL-Abholpunkte ist auf dieser öffentlichen Seite nicht beschrieben (intern/Superadmin, auf Anfrage). Kontakt: [email protected].

Bei POST /api/v1/routing/optimize können pro Stopp pickup_point_id und in optimization_params gel_cost_to_time_equivalent_minutes_per_eur gesetzt werden. Fehlt dem Token-Benutzer wirksames gel_proximity, entfernt die API diese Felder still vor der Lösung — Flags/Tier prüfen, bevor Sie GEL in der Optimierung nutzen.

3. Authentifizierung

OAuth2-ähnlicher Password-Grant für JWT, danach Authorization: Bearer <token>.

curl -X POST "https://flow.icarry.it/api/v1/auth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=password&username=USER&password=SECRET"

Vor Ablauf erneuern (oft ~24h). Für Server-zu-Server technische Benutzer verwenden.

4. End-to-End-Ablauf

  1. TMS-Daten auf RoutingOptimizationRequest abbilden (Hauptschema auf dieser Seite).
  2. Fehlen lat/lng, Adressen mit POST /api/v1/geocoding/forward auflösen (lookup nur für Cache-Treffer). POST /optimize verlangt weiterhin numerische Koordinaten. Siehe Geocoding.
  3. Optional (Enterprise): synchronisieren Sie Ihre Pins mit POST /api/v1/geocoding/pins, damit spätere Lookups Ihre Koordinaten wiederverwenden. Die automatische Erfassung aus POST /optimize lässt sich unter /api/v1/geocoding/pins/settings aktivieren.
  4. POST /api/v1/routing/optimize mit async_processing: true → job_id.
  5. GET /api/v1/routing/jobs/{job_id} alle 5–10s pollen oder WebSocket/Webhook nutzen.
  6. Bei status completed das result lesen; bei Bedarf Karten/Excel über weitere Endpunkte.

5. Minimales Optimize-Beispiel

curl -X POST "https://flow.icarry.it/api/v1/routing/optimize" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "async_processing": true,
    "session_id": "tms-2026-04-02-001",
    "delivery_points": [{"tracking_number":"1","delivery_company":"ACME","address":"Via Roma 1, Milano","lat":45.46,"lng":9.19,"tot_items":1,"priority":1}],
    "drivers": [{"name":"Driver 1","start_lat":45.46,"start_lng":9.19,"end_lat":45.46,"end_lng":9.19,"capacity":50,"vehicle_type":"van_standard","max_distance_km":200}],
    "algorithms": ["standard"],
    "optimization_objective": "time"
  }'

Warum es time, distance, balanced und cost gibt: Auswahlhilfe.

6. Webhooks

webhook_url in der Optimize-Anfrage: POST mit gleicher Struktur wie abgeschlossenes Job-Ergebnis. Optional Verifikation über X-iCarry-Signature. Fehlschläge mit Backoff wiederholt.

7. Best Practices

8. Fehleranalyse & Support

Bei Anfragen an [email protected] Job-ID, HTTP-Status, anonymisiertes Payload und Zeitstempel angeben.