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
- Laden Sie Logistikdaten (Fahrer + Lieferungen) im erwarteten Format von
RoutingOptimizationRequest. - Senden Sie POST /api/v1/routing/optimize mit async_processing=true; erhalten Sie eine job_id.
- Überwachen Sie den Status via GET /api/v1/routing/jobs/{job_id} (Polling 5-10s) oder via WebSocket /ws/jobs.
- Bei status=completed lesen Sie result, exportieren Sie Dateien oder generieren Sie Karten mit dedizierten Endpunkten.
- 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_number | tracking_number | ja | String ≤64 | Stopp-ID |
delivery_address | address | ja (oder lat+lng) | String | Geokodierung / Anzeige |
delivery_company | delivery_company | ja in JSON (Import-Standard „Cliente“) | String | Metadaten |
lat / lng | lat / lng | ja in JSON; optional in Excel bei Adresse | Grad | Matrix / Geometrie |
tot_items | tot_items | nein (Standard 1) | int ≥1 | Kapazität (Kolli) |
priority | priority | nein (Standard 1) | 1–10 (1 = hoch) | Priorität / Drop |
estimated_duration | estimated_duration | nein | Minuten | Servicezeit am Stopp |
notes | notes | nein | String ≤500 | Nur Fahrer-App |
phone | phone | nein | E.164 (+ und Ziffern, z. B. +393331234567) | Empfängertelefon (tel-Link in App und Control Tower) |
preassigned_driver | preassigned_driver | nein | drivers[].name | Lock → mandatory_assignments |
point_type | point_type | nein (Standard delivery) | pickup | delivery | Reihenfolge Abholung→Lieferung; Abholung ohne Verknüpfung = eigenständige Haltestelle |
pickup_point_id | pickup_point_id | nein | String | Verknüpfung Lieferung→Abholung; ohne Verknüpfung Rückkehr zum Ankunftspunkt |
time_window_start / end | gleich | nein | HH:MM | Zeitfenster |
volume_m3 / weight_kg | gleich | nein | float ≥0 | Volumengrenze (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 |
|---|---|---|---|
name | name | ja | Identität |
phone | phone | nein | Optionales Fahrertelefon in E.164 |
start_address / end_address | — | start beim Import Pflicht | Geokodierung → start_* / end_* |
lat / lng | start_lat / start_lng | ja in JSON | Startdepot |
end_lat / end_lng | end_lat / end_lng | ja in JSON (Standard = start) | Rückkehrdepot |
capacity | capacity | nein (Standard 50) | Max. Kolli (tot_items) |
max_volume_m3 | max_volume_m3 | nein | Volumenkapazität |
vehicle_type | vehicle_type | nein (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_profile | routing_profile | nein | Override: car, van_standard, van_maxi, truck_7_5t, truck_12t, truck_18t, truck_32t, artic_44t, icarry_cargo_bike |
max_distance_km | max_distance_km | nein | Max. km |
hourly_cost, fuel_consumption, prezzo_litro, costo_pedaggio_km | gleich | nein | Kosten / Reports |
start_time / end_time | gleich | nein (08:00–18:00 bei Paar) | Schicht |
break_start / break_end | gleich | als Paar | Pause |
max_minutes | max_minutes | nein | Max. 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 |
|---|---|---|
car | Pkw (M1) | Standard-Pkw. |
van Alias | Transporter (N1) | Gleich wie van_standard. |
van_standard | Transporter (N1) | Kompakter Transporter bis 2,5 t, Höhe ca. 1,9 m. |
van_maxi | Transporter (N1) | Hochdach-Transporter bis 3,5 t, Höhe ca. 2,7 m. |
truck Alias | Lkw | Gleich wie truck_7_5t. |
truck_7_5t | Lkw | Leichter Stadt-Lkw, zGG 7,5 t. |
truck_12t | Lkw | Mittlerer Lkw, zGG 12 t. Beispiel: Iveco TGM 13.250 4x4 → truck_12t. |
truck_18t | Lkw | Schwerer 2-Achs-Lkw, zGG 18 t. |
truck_32t | Lkw | 4-Achs-Lkw, zGG 32 t. |
artic_44t | Sattelzug | Sattelzug 44 t, ca. 16,5 m. |
bike Alias | Mikrologistik | Gleich wie icarry_cargo_bike. |
scooter Alias | Pkw (M1) | Gleich wie car. |
icarry_cargo_bike | Mikrologistik | Lastenrad 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:
- Lieferungen: address/delivery_address ← indirizzo, destinazione, location · delivery_company ← destinatario, cliente, company · tot_items ← colli, quantity, pezzi · phone ← telefono, tel, cellulare, mobile · time_window_start/end ← fascia_dalle/alle, dalle/alle, window_start/end.
- Fahrer: name ← nome, autista, fattorino · start_address/end_address ← partenza/rientro, departure/arrival · capacity ← capacita, max_consegne · start_time/end_time ← turno_inizio/fine, shift_start/end.
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
- CSV/XLSX-Vorlagen — GET /api/v1/templates/driver-template und /api/v1/templates/delivery-template. Spaltenwörterbuch: siehe „Eingabedaten-Wörterbuch“ auf dieser Seite.
- Fahrerkarten — GET /api/v1/routing/driver-maps listet tenant-bezogene Karten (JWT). Einzelkarten-HTML-URLs bleiben Capability-Links.
- Driver App HTML — GET /api/v1/routing/jobs/{job_id}/download-driver-app?driver_name={driver_name} gibt die Offline-Version der Einzelfahrer-Karte zurück.
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.
- Automatisierung — tägliche oder bedarfsgesteuerte Neuoptimierung.
- Zuverlässigkeit — asynchrone Jobs, Webhook-Retries, Health über
/routing/status.
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.
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
- TMS-Daten auf
RoutingOptimizationRequestabbilden (Hauptschema auf dieser Seite). - Fehlen lat/lng, Adressen mit
POST /api/v1/geocoding/forwardauflösen (lookupnur für Cache-Treffer).POST /optimizeverlangt weiterhin numerische Koordinaten. Siehe Geocoding. - Optional (Enterprise): synchronisieren Sie Ihre Pins mit
POST /api/v1/geocoding/pins, damit spätere Lookups Ihre Koordinaten wiederverwenden. Die automatische Erfassung ausPOST /optimizelässt sich unter/api/v1/geocoding/pins/settingsaktivieren. POST /api/v1/routing/optimizemitasync_processing: true→job_id.GET /api/v1/routing/jobs/{job_id}alle 5–10s pollen oder WebSocket/Webhook nutzen.- Bei
statuscompleted dasresultlesen; 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
- Etwa 80–120 Stopps pro Job; sehr große Instanzen aufteilen.
- Eindeutige
session_id, um 409-Duplikate zu vermeiden. - 401 durch Token-Refresh; 403 kann gesperrten Algorithmus oder fehlende Admin-Rechte bedeuten.
/routing/statusund Job-Fehlerpayloads für Monitoring nutzen.
8. Fehleranalyse & Support
Bei Anfragen an [email protected] Job-ID, HTTP-Status, anonymisiertes Payload und Zeitstempel angeben.