Packing API
Υποβάλετε φορτίο και λάβετε πίσω ένα βελτιστοποιημένο, φυσικά έγκυρο σχέδιο φόρτωσης — τοποθετήσεις, μέτρα φόρτωσης, γραμμικά πόδια και χρεώσιμες θέσεις παλέτας. Ο ίδιος μηχανισμός που χρησιμοποιείται στην εφαρμογή, συνεχώς επικυρωμένος με βάση πραγματικά σχέδια αποστολέων. Πρόσβαση sandbox σε κάθε πρόγραμμα· πρόσβαση παραγωγής στο Enterprise.
Γρήγορη εκκίνηση
- Συνδεθείτε → κάντε κλικ στο όνομά σας → API → δημιουργήστε ένα κλειδί.
- Υποβάλετε μια εργασία συσκευασίας (αυτή εκτελείται σε 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_count | integer | Πόσα αντικείμενα χωράνε / δεν χωράνε. |
| units | "metric" | "imperial" | Οι μονάδες στις οποίες εκφράζονται όλοι οι αριθμοί παρακάτω (αντιστοιχούν στο αίτημα). |
| metrics.ldm_m | number | Μέτρα φόρτωσης — η έκταση του μπλοκ φορτίου (μέγιστο τέλος − ελάχιστη αρχή). |
| metrics.linear_ft | number | Η ίδια έκταση σε γραμμικά πόδια (US LTL). |
| metrics.span_mm | integer | Η έκταση σε mm, πάντα μετρική. |
| metrics.pallet_positions_eur | integer | null | Χρεώσιμες θέσεις παλέτας EUR. null όταν το σχέδιο είναι πολύ μεγάλο για μέτρηση. |
| metrics.total_weight_kg | number | Βάρος τοποθετημένων αντικειμένων, πάντα σε kg. |
| metrics.overlaps | integer | Ζεύγη που διαπερνούν το ένα το άλλο — πάντα 0 για έγκυρο σχέδιο. |
| items[].placed | boolean | Αν το αντικείμενο τοποθετήθηκε στο σχέδιο. |
| items[].x / y / z | number | null | Θέση στις μονάδες του αιτήματος: x από την πλευρά της πόρτας, y από τον αριστερό τοίχο, z από το πάτωμα. Και τα τρία είναι null όταν placed είναι false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Προσανατολισμός: περιστροφή γύρω από τον κατακόρυφο άξονα· tilt = τοποθετημένο στο πλάι. |
| items[].length / width / height / weight | number | Το αντικείμενο όπως υποβλήθηκε, επαναλαμβάνεται στις μονάδες του αιτήματος. |
| plan_url | string | null | Το δημιουργημένο σχέδιο στην εφαρμογή. null για εργασίες sandbox. |
Εκδόσεις & σταθερότητα
Το συμβόλαιο είναι εκδομένο στη διαδρομή (/api/v1/). Μέσα στην v1, οι αλλαγές είναι μόνο προσθετικές — νέα προαιρετικά πεδία αιτήματος, νέα πεδία απόκρισης, νέοι κωδικοί οχημάτων και κωδικοί σφαλμάτων μπορεί να εμφανιστούν, και οι πελάτες πρέπει να αγνοούν πεδία που δεν αναγνωρίζουν. Υπάρχοντα πεδία δεν αλλάζουν ποτέ σημασία ή τύπο, και τίποτα δεν αφαιρείται. Μια αλλαγή που σπάει τη συμβατότητα σημαίνει νέα διαδρομή έκδοσης, με τη v1 να διατηρείται παράλληλα για τουλάχιστον 12 μήνες και ειδοποίηση κατάργησης μέσω email σε κάθε χώρο εργασίας με ενεργό κλειδί.
Πεδία αιτήματος
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
| vehicle | string | Ένας κωδικός οχήματος από τους παρακάτω πίνακες. Ή περάστε custom_vehicle_id (όχημα από τον στόλο του χώρου εργασίας σας). |
| objective | "ldm" | "pallets" | Ελαχιστοποίηση μέτρων φόρτωσης ή χρεώσιμων θέσεων παλέτας. Προεπιλογή "ldm". |
| units | "metric" | "imperial" | Πώς διαβάζονται ΚΑΙ επιστρέφονται οι διαστάσεις και τα βάρη των αντικειμένων: mm/kg (προεπιλογή) ή in/lb. Οι θέσεις στην απόκριση ακολουθούν τις ίδιες μονάδες. |
| items | array, required | Το μανιφέστο φορτίου (πεδία παρακάτω). |
| sandbox | boolean | Λειτουργία δοκιμής: πλήρες αποτέλεσμα, τίποτα δεν αποθηκεύεται. Διαθέσιμο σε κάθε πρόγραμμα. |
| name | string | Όνομα σχεδίου (λειτουργία παραγωγής). |
| ldm_limit_m | number | Περιορισμός του φορτίου στα πρώτα N μέτρα φόρτωσης (φορτηγά). |
| budget_ms | number | Προϋπολογισμός χρόνου βελτιστοποίησης (παραγωγή· προεπιλογή 30000, μέγιστο 300000). |
| callback_url | https URL | Αποστέλλεται με POST το αποτέλεσμα όταν ολοκληρωθεί η εργασία, υπογεγραμμένο (δείτε Webhooks). |
Πεδία αντικειμένου
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
| length / width / height | number, required | Διαστάσεις αντικειμένου, διαβάζονται στις μονάδες του αιτήματος (mm από προεπιλογή, ίντσες με "units": "imperial"). |
| weight | number, required | Βάρος αντικειμένου (kg από προεπιλογή, lb με "units": "imperial"). |
| quantity | integer, default 1 | Αναπτύσσεται σε μεμονωμένες μονάδες. |
| name | string, optional | Εμφανίζεται στο σχέδιο και στην απόκριση. |
| stackable | boolean, default true | Άλλα φορτία μπορούν να τοποθετηθούν πάνω από αυτό το αντικείμενο. |
| max_stack | number, optional | Μέγιστο βάρος που μπορεί να αντέξει αυτό το αντικείμενο από πάνω (ίδιες μονάδες με το βάρος). |
| fragile | boolean, default false | Εύθραυστα αντικείμενα τοποθετούνται μόνο στα ανώτερα στρώματα. |
| tiltable | boolean, default true | Επιτρέπεται να τοποθετηθεί το αντικείμενο στο πλάι. |
| destination_stop | integer, default 1 | Σημείο παράδοσης για φόρτωση LIFO πολλαπλών στάσεων. |
Κωδικοί οχημάτων
Δημιουργούνται από τις προδιαγραφές του ενεργού μηχανισμού. Τα προσαρμοσμένα οχήματα από τον στόλο του χώρου εργασίας σας λειτουργούν μέσω custom_vehicle_id.
Φορτηγά & ρυμουλκούμενα
| Κωδικός | Όχημα | Εσωτερικό (Μ×Π×Υ) | Φορτίο |
|---|---|---|---|
| CURTAINSIDER_136 | 13.6m Curtainsider | 13.62 × 2.48 × 2.70 m | 24 t |
| BOX_136 | 13.6m Box Trailer | 13.62 × 2.46 × 2.68 m | 24 t |
| MEGA_136 | 13.6m Mega Trailer | 13.62 × 2.48 × 3.00 m | 22.5 t |
| MEGA_CURTAIN_136 | 13.6m Mega Curtainsider | 13.62 × 2.48 × 3.00 m | 22 t |
| FLATBED_136 | 13.6m Flatbed | 13.62 × 2.48 × 3.00 m | 25 t |
| REEFER_136 | 13.6m Reefer | 13.32 × 2.44 × 2.54 m | 22 t |
| CURTAINSIDER_75 | 7.5m City Curtainsider | 7.50 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_715 | 7.15m Swap Body | 7.15 × 2.48 × 2.70 m | 12 t |
| SWAPBODY_745 | 7.45m Swap Body | 7.45 × 2.48 × 2.70 m | 12 t |
| DRY_VAN_53 | 53ft Dry Van | 16.15 × 2.59 × 2.74 m | 20 t |
| FLATBED_53 | 53ft Flatbed | 16.15 × 2.59 × 3.66 m | 22 t |
| REEFER_53 | 53ft Reefer | 15.85 × 2.46 × 2.59 m | 18.5 t |
| CURTAINSIDER_125_CN | 12.5m Curtainsider (CN) | 12.50 × 2.50 × 2.80 m | 27 t |
| FLATBED_40_IN | 40ft Flatbed (IN) | 12.19 × 2.50 × 3.50 m | 26 t |
| BOX_138_BR | 13.8m Box Van (BR) | 13.80 × 2.50 × 2.90 m | 28 t |
| CURTAINSIDER_12_ZA | 12m Curtainsider (ZA) | 12.00 × 2.48 × 2.70 m | 28 t |
Κοντέινερ
| Κωδικός | Κοντέινερ | Εσωτερικό (Μ×Π×Υ) | Φορτίο |
|---|---|---|---|
| 20DC | 20' Dry Container | 5.89 × 2.35 × 2.39 m | 21.727 t |
| 20HC | 20' High Cube | 5.89 × 2.35 × 2.70 m | 21.58 t |
| 40DC | 40' Dry Container | 12.03 × 2.35 × 2.39 m | 26.63 t |
| 40HC | 40' High Cube | 12.03 × 2.35 × 2.70 m | 26.58 t |
| 45HC | 45' High Cube | 13.56 × 2.35 × 2.70 m | 25.68 t |
| 20OT | 20' Open Top | 5.89 × 2.35 × 2.39 m | 21.64 t |
| 40OT | 40' Open Top | 12.03 × 2.35 × 2.39 m | 26.58 t |
| 20RF | 20' Reefer | 5.44 × 2.29 × 2.27 m | 21 t |
| 40RF | 40' Reefer | 11.58 × 2.29 × 2.21 m | 25.6 t |
| 40RFHC | 40' Reefer High Cube | 11.58 × 2.29 × 2.54 m | 25.88 t |
| 53DC | 53' Domestic | 16.15 × 2.59 × 2.90 m | 26 t |
Επίπεδα πρόσβασης & όρια
| Sandbox (κάθε πρόγραμμα) | Παραγωγή (Enterprise) | |
|---|---|---|
| Κλήσεις | 25 επιτυχημένες / μήνα | 5.000 επιτυχημένες συσκευασίες / μήνα |
| Αντικείμενα ανά μανιφέστο | 20 | 5,000 |
| Ταυτόχρονες εργασίες | 1 | 10 |
| Προϋπολογισμός βελτιστοποίησης | 10 s | 30 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_key | 401 | Λείπει, είναι κακοσχηματισμένο ή έχει ανακληθεί το κλειδί API. |
| invalid_json | 400 | Το σώμα δεν είναι έγκυρο JSON. |
| invalid_vehicle | 400 | Άγνωστος κωδικός οχήματος / custom_vehicle_id. |
| invalid_items | 400 | Ένα πεδίο αντικειμένου λείπει, δεν είναι αριθμητικό ή είναι εκτός εύρους. |
| suspicious_dimensions | 400 | Όλες οι διαστάσεις είναι κάτω από 100mm — πιθανώς ίντσες που στάλθηκαν ως mm. Περάστε "units": "imperial". |
| invalid_units | 400 | Το units πρέπει να είναι "metric" ή "imperial". |
| invalid_objective | 400 | Το objective πρέπει να είναι "ldm" ή "pallets". |
| invalid_callback | 400 | Το callback_url πρέπει να είναι https. |
| too_many_items | 400 | Το μανιφέστο υπερβαίνει το όριο αντικειμένων για το επίπεδο πρόσβασής σας. |
| upgrade_required | 402 | Η λειτουργία παραγωγής απαιτεί το πρόγραμμα Enterprise. Χρησιμοποιήστε sandbox ή αναβαθμίστε. |
| sandbox_limit_reached | 402 | Έχει εξαντληθεί το μηνιαίο όριο sandbox — επαναφέρεται την 1η του μήνα. |
| quota_exceeded | 402 | Έχετε εξαντλήσει το μηνιαίο όριο των 5.000 συσκευασιών — επαναρυθμίζεται την 1η ημέρα του μήνα. Για μεγαλύτερο όγκο: επικοινωνήστε μαζί μας. |
| too_many_jobs | 429 | Έχει συμπληρωθεί το όριο ταυτόχρονων εργασιών. Ελέγξτε τις εκτελούμενες εργασίες και δοκιμάστε ξανά. |
| not_found | 404 | Δεν υπάρχει τέτοια εργασία για αυτόν τον χώρο εργασίας. |
Ερωτήσεις, υψηλότερα όρια ή ένας σύνδεσμος που χρειάζεστε (Zapier, Excel, MCP); hello@hansatic.com