Packing API

Υποβάλετε φορτίο και λάβετε πίσω ένα βελτιστοποιημένο, φυσικά έγκυρο σχέδιο φόρτωσης — τοποθετήσεις, μέτρα φόρτωσης, γραμμικά πόδια και χρεώσιμες θέσεις παλέτας. Ο ίδιος μηχανισμός που χρησιμοποιείται στην εφαρμογή, συνεχώς επικυρωμένος με βάση πραγματικά σχέδια αποστολέων. Πρόσβαση sandbox σε κάθε πρόγραμμα· πρόσβαση παραγωγής στο Enterprise.

Γρήγορη εκκίνηση

  1. Συνδεθείτε → κάντε κλικ στο όνομά σας → API → δημιουργήστε ένα κλειδί.
  2. Υποβάλετε μια εργασία συσκευασίας (αυτή εκτελείται σε sandbox — δωρεάν σε κάθε πρόγραμμα):
curl -X POST https://hansatic.com/api/v1/pack \
  -H "Authorization: Bearer hk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "vehicle": "CURTAINSIDER_136",
    "objective": "ldm",
    "sandbox": true,
    "items": [{
      "name": "Machine crate",
      "length": 2300, "width": 750, "height": 1400,
      "weight": 300, "quantity": 7,
      "stackable": false, "tiltable": false
    }]
  }'
{
  "job_id": "5e3617d1-abe4-4549-b7e6-d18c6baf814f",
  "status": "queued",
  "sandbox": true,
  "status_url": "https://hansatic.com/api/v1/jobs/5e3617d1-..."
}

Ελέγχετε περιοδικά το status_url (με το ίδιο κεφαλίδα αυθεντικοποίησης) μέχρι το status να γίνει "done":

{
  "job_id": "5e3617d1-...",
  "status": "done",
  "result": {
    "placed_count": 7,
    "unplaced_count": 0,
    "units": "metric",
    "metrics": {
      "ldm_m": 5.25,
      "span_mm": 5250,
      "linear_ft": 17.2,
      "pallet_positions_eur": 14,
      "total_weight_kg": 2100,
      "overlaps": 0
    },
    "items": [
      { "id": "...", "name": "Machine crate", "placed": true,
        "x": 8370, "y": 0, "z": 0,
        "rotation_deg": 90, "tilt_deg": 0, "...": "..." }
    ],
    "plan_url": "https://hansatic.com/en/app/plans/..."
  }
}

Τερματικά σημεία

POST /api/v1/pack

Επικυρώνει και βάζει σε ουρά μια εργασία συσκευασίας. Επιστρέφει 202 με ένα job_id. Υποστηρίζει κεφαλίδα Idempotency-Key — οι επαναλήψεις με το ίδιο κλειδί επιστρέφουν την αρχική εργασία αντί να συσκευάσουν ξανά.

GET /api/v1/jobs/{id}

Κατάσταση εργασίας και, όταν ολοκληρωθεί, το πλήρες αποτέλεσμα. Τα αποτελέσματα διατηρούνται για 30 ημέρες· τα σχέδια παραγωγής παραμένουν μόνιμα στον χώρο εργασίας σας.

GET /api/v1/openapi.json

Το αναγνώσιμο από μηχανή συμβόλαιο OpenAPI 3.1 — εισαγάγετέ το στο Postman, σε γεννήτριες κώδικα ή στείλτε το σε εργαλείο κωδικοποίησης με AI. Οι κωδικοί οχημάτων ενημερώνονται από τον ενεργό μηχανισμό, οπότε είναι πάντα ενημερωμένο. Ανοίξτε το συμβόλαιο ↗

Πεδία απόκρισης

Το αντικείμενο result σε μια ολοκληρωμένη εργασία:

ΠεδίοΤύποςΠεριγραφή
placed_count / unplaced_countintegerΠόσα αντικείμενα χωράνε / δεν χωράνε.
units"metric" | "imperial"Οι μονάδες στις οποίες εκφράζονται όλοι οι αριθμοί παρακάτω (αντιστοιχούν στο αίτημα).
metrics.ldm_mnumberΜέτρα φόρτωσης — η έκταση του μπλοκ φορτίου (μέγιστο τέλος − ελάχιστη αρχή).
metrics.linear_ftnumberΗ ίδια έκταση σε γραμμικά πόδια (US LTL).
metrics.span_mmintegerΗ έκταση σε mm, πάντα μετρική.
metrics.pallet_positions_eurinteger | nullΧρεώσιμες θέσεις παλέτας EUR. null όταν το σχέδιο είναι πολύ μεγάλο για μέτρηση.
metrics.total_weight_kgnumberΒάρος τοποθετημένων αντικειμένων, πάντα σε kg.
metrics.overlapsintegerΖεύγη που διαπερνούν το ένα το άλλο — πάντα 0 για έγκυρο σχέδιο.
items[].placedbooleanΑν το αντικείμενο τοποθετήθηκε στο σχέδιο.
items[].x / y / znumber | nullΘέση στις μονάδες του αιτήματος: x από την πλευρά της πόρτας, y από τον αριστερό τοίχο, z από το πάτωμα. Και τα τρία είναι null όταν placed είναι false.
items[].rotation_deg / tilt_deg0 | 90Προσανατολισμός: περιστροφή γύρω από τον κατακόρυφο άξονα· tilt = τοποθετημένο στο πλάι.
items[].length / width / height / weightnumberΤο αντικείμενο όπως υποβλήθηκε, επαναλαμβάνεται στις μονάδες του αιτήματος.
plan_urlstring | nullΤο δημιουργημένο σχέδιο στην εφαρμογή. null για εργασίες sandbox.

Εκδόσεις & σταθερότητα

Το συμβόλαιο είναι εκδομένο στη διαδρομή (/api/v1/). Μέσα στην v1, οι αλλαγές είναι μόνο προσθετικές — νέα προαιρετικά πεδία αιτήματος, νέα πεδία απόκρισης, νέοι κωδικοί οχημάτων και κωδικοί σφαλμάτων μπορεί να εμφανιστούν, και οι πελάτες πρέπει να αγνοούν πεδία που δεν αναγνωρίζουν. Υπάρχοντα πεδία δεν αλλάζουν ποτέ σημασία ή τύπο, και τίποτα δεν αφαιρείται. Μια αλλαγή που σπάει τη συμβατότητα σημαίνει νέα διαδρομή έκδοσης, με τη v1 να διατηρείται παράλληλα για τουλάχιστον 12 μήνες και ειδοποίηση κατάργησης μέσω email σε κάθε χώρο εργασίας με ενεργό κλειδί.

Πεδία αιτήματος

ΠεδίοΤύποςΠεριγραφή
vehiclestringΈνας κωδικός οχήματος από τους παρακάτω πίνακες. Ή περάστε custom_vehicle_id (όχημα από τον στόλο του χώρου εργασίας σας).
objective"ldm" | "pallets"Ελαχιστοποίηση μέτρων φόρτωσης ή χρεώσιμων θέσεων παλέτας. Προεπιλογή "ldm".
units"metric" | "imperial"Πώς διαβάζονται ΚΑΙ επιστρέφονται οι διαστάσεις και τα βάρη των αντικειμένων: mm/kg (προεπιλογή) ή in/lb. Οι θέσεις στην απόκριση ακολουθούν τις ίδιες μονάδες.
itemsarray, requiredΤο μανιφέστο φορτίου (πεδία παρακάτω).
sandboxbooleanΛειτουργία δοκιμής: πλήρες αποτέλεσμα, τίποτα δεν αποθηκεύεται. Διαθέσιμο σε κάθε πρόγραμμα.
namestringΌνομα σχεδίου (λειτουργία παραγωγής).
ldm_limit_mnumberΠεριορισμός του φορτίου στα πρώτα N μέτρα φόρτωσης (φορτηγά).
budget_msnumberΠροϋπολογισμός χρόνου βελτιστοποίησης (παραγωγή· προεπιλογή 30000, μέγιστο 300000).
callback_urlhttps URLΑποστέλλεται με POST το αποτέλεσμα όταν ολοκληρωθεί η εργασία, υπογεγραμμένο (δείτε Webhooks).

Πεδία αντικειμένου

ΠεδίοΤύποςΠεριγραφή
length / width / heightnumber, requiredΔιαστάσεις αντικειμένου, διαβάζονται στις μονάδες του αιτήματος (mm από προεπιλογή, ίντσες με "units": "imperial").
weightnumber, requiredΒάρος αντικειμένου (kg από προεπιλογή, lb με "units": "imperial").
quantityinteger, default 1Αναπτύσσεται σε μεμονωμένες μονάδες.
namestring, optionalΕμφανίζεται στο σχέδιο και στην απόκριση.
stackableboolean, default trueΆλλα φορτία μπορούν να τοποθετηθούν πάνω από αυτό το αντικείμενο.
max_stacknumber, optionalΜέγιστο βάρος που μπορεί να αντέξει αυτό το αντικείμενο από πάνω (ίδιες μονάδες με το βάρος).
fragileboolean, default falseΕύθραυστα αντικείμενα τοποθετούνται μόνο στα ανώτερα στρώματα.
tiltableboolean, default trueΕπιτρέπεται να τοποθετηθεί το αντικείμενο στο πλάι.
destination_stopinteger, default 1Σημείο παράδοσης για φόρτωση LIFO πολλαπλών στάσεων.

Κωδικοί οχημάτων

Δημιουργούνται από τις προδιαγραφές του ενεργού μηχανισμού. Τα προσαρμοσμένα οχήματα από τον στόλο του χώρου εργασίας σας λειτουργούν μέσω custom_vehicle_id.

Φορτηγά & ρυμουλκούμενα

ΚωδικόςΌχημαΕσωτερικό (Μ×Π×Υ)Φορτίο
CURTAINSIDER_13613.6m Curtainsider13.62 × 2.48 × 2.70 m24 t
BOX_13613.6m Box Trailer13.62 × 2.46 × 2.68 m24 t
MEGA_13613.6m Mega Trailer13.62 × 2.48 × 3.00 m22.5 t
MEGA_CURTAIN_13613.6m Mega Curtainsider13.62 × 2.48 × 3.00 m22 t
FLATBED_13613.6m Flatbed13.62 × 2.48 × 3.00 m25 t
REEFER_13613.6m Reefer13.32 × 2.44 × 2.54 m22 t
CURTAINSIDER_757.5m City Curtainsider7.50 × 2.48 × 2.70 m12 t
SWAPBODY_7157.15m Swap Body7.15 × 2.48 × 2.70 m12 t
SWAPBODY_7457.45m Swap Body7.45 × 2.48 × 2.70 m12 t
DRY_VAN_5353ft Dry Van16.15 × 2.59 × 2.74 m20 t
FLATBED_5353ft Flatbed16.15 × 2.59 × 3.66 m22 t
REEFER_5353ft Reefer15.85 × 2.46 × 2.59 m18.5 t
CURTAINSIDER_125_CN12.5m Curtainsider (CN)12.50 × 2.50 × 2.80 m27 t
FLATBED_40_IN40ft Flatbed (IN)12.19 × 2.50 × 3.50 m26 t
BOX_138_BR13.8m Box Van (BR)13.80 × 2.50 × 2.90 m28 t
CURTAINSIDER_12_ZA12m Curtainsider (ZA)12.00 × 2.48 × 2.70 m28 t

Κοντέινερ

ΚωδικόςΚοντέινερΕσωτερικό (Μ×Π×Υ)Φορτίο
20DC20' Dry Container5.89 × 2.35 × 2.39 m21.727 t
20HC20' High Cube5.89 × 2.35 × 2.70 m21.58 t
40DC40' Dry Container12.03 × 2.35 × 2.39 m26.63 t
40HC40' High Cube12.03 × 2.35 × 2.70 m26.58 t
45HC45' High Cube13.56 × 2.35 × 2.70 m25.68 t
20OT20' Open Top5.89 × 2.35 × 2.39 m21.64 t
40OT40' Open Top12.03 × 2.35 × 2.39 m26.58 t
20RF20' Reefer5.44 × 2.29 × 2.27 m21 t
40RF40' Reefer11.58 × 2.29 × 2.21 m25.6 t
40RFHC40' Reefer High Cube11.58 × 2.29 × 2.54 m25.88 t
53DC53' Domestic16.15 × 2.59 × 2.90 m26 t

Επίπεδα πρόσβασης & όρια

Sandbox (κάθε πρόγραμμα)Παραγωγή (Enterprise)
Κλήσεις25 επιτυχημένες / μήνα5.000 επιτυχημένες συσκευασίες / μήνα
Αντικείμενα ανά μανιφέστο205,000
Ταυτόχρονες εργασίες110
Προϋπολογισμός βελτιστοποίησης10 s30 s προεπιλογή, έως 300 s
ΔιατήρησηΤίποτα δεν αποθηκεύεταιΚάθε συσκευασία δημιουργεί πραγματικό σχέδιο στον χώρο εργασίας σας

Μετράνε μόνο οι επιτυχημένες συσκευασίες — οι αποτυχημένες επικυρώσεις και οι αποτυχημένες εργασίες δεν χρεώνονται στο όριο. Οι μετρητές επαναρυθμίζονται την 1η ημέρα του μήνα (UTC). Τα αποτελέσματα του sandbox είναι πλήρη και χωρίς περιορισμούς — το όριο αφορά την πρόσβαση, όχι την έξοδο. Χρειάζεστε περισσότερες από 5.000 συσκευασίες τον μήνα; Επικοινωνήστε μαζί μας για προσφορές όγκου και OEM τιμές.

Webhooks

Περάστε callback_url για να λάβετε το αποτέλεσμα μέσω POST όταν ολοκληρωθεί η εργασία. Κάθε κλήση περιλαμβάνει X-Hansatic-Signature: ένα HMAC-SHA256 του ακατέργαστου σώματος με το μυστικό κλειδί webhook σας (εμφανίζεται μία φορά κατά τη δημιουργία του κλειδιού). Επικυρώστε το:

const crypto = require('crypto');

function verify(rawBody, signatureHeader, webhookSecret) {
  const expected = crypto.createHmac('sha256', webhookSecret)
    .update(rawBody).digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(signatureHeader));
}

Η αποστολή γίνεται σε μία προσπάθεια με χρονικό όριο 5s — το status_url παραμένει πάντα η πηγή αλήθειας.

Σφάλματα

Όλα τα σφάλματα είναι { "error": { "code", "message", ... } } — αναγνώσιμος από μηχανή κωδικός, αναγνώσιμη από ανθρώπους περιγραφή, και field όταν ένα συγκεκριμένο πεδίο εισόδου είναι εσφαλμένο.

ΚωδικόςHTTPΣημασία
invalid_key401Λείπει, είναι κακοσχηματισμένο ή έχει ανακληθεί το κλειδί API.
invalid_json400Το σώμα δεν είναι έγκυρο JSON.
invalid_vehicle400Άγνωστος κωδικός οχήματος / custom_vehicle_id.
invalid_items400Ένα πεδίο αντικειμένου λείπει, δεν είναι αριθμητικό ή είναι εκτός εύρους.
suspicious_dimensions400Όλες οι διαστάσεις είναι κάτω από 100mm — πιθανώς ίντσες που στάλθηκαν ως mm. Περάστε "units": "imperial".
invalid_units400Το units πρέπει να είναι "metric" ή "imperial".
invalid_objective400Το objective πρέπει να είναι "ldm" ή "pallets".
invalid_callback400Το callback_url πρέπει να είναι https.
too_many_items400Το μανιφέστο υπερβαίνει το όριο αντικειμένων για το επίπεδο πρόσβασής σας.
upgrade_required402Η λειτουργία παραγωγής απαιτεί το πρόγραμμα Enterprise. Χρησιμοποιήστε sandbox ή αναβαθμίστε.
sandbox_limit_reached402Έχει εξαντληθεί το μηνιαίο όριο sandbox — επαναφέρεται την 1η του μήνα.
quota_exceeded402Έχετε εξαντλήσει το μηνιαίο όριο των 5.000 συσκευασιών — επαναρυθμίζεται την 1η ημέρα του μήνα. Για μεγαλύτερο όγκο: επικοινωνήστε μαζί μας.
too_many_jobs429Έχει συμπληρωθεί το όριο ταυτόχρονων εργασιών. Ελέγξτε τις εκτελούμενες εργασίες και δοκιμάστε ξανά.
not_found404Δεν υπάρχει τέτοια εργασία για αυτόν τον χώρο εργασίας.

Ερωτήσεις, υψηλότερα όρια ή ένας σύνδεσμος που χρειάζεστε (Zapier, Excel, MCP); hello@hansatic.com