पैकिंग एपीआई
कार्गो सबमिट करें और एक ऑप्टिमाइज़्ड, भौतिक रूप से वैध लोड प्लान प्राप्त करें — प्लेसमेंट, लोडिंग मीटर, लीनियर फीट और बिल्ड पैलेट पोजीशन। यह वही इंजन है जो ऐप के पीछे काम करता है, वास्तविक डिस्पैचर लेआउट के विरुद्ध निरंतर पुष्टि की गई। हर प्लान पर सैंडबॉक्स एक्सेस; एंटरप्राइज पर प्रोडक्शन एक्सेस।
त्वरित शुरुआत
- साइन इन करें → अपने नाम पर क्लिक करें → एपीआई → एक कुंजी जनरेट करें।
- एक पैक जॉब सबमिट करें (यह सैंडबॉक्स में चलेगा — हर प्लान पर मुफ्त):
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
मशीन-readable 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 | विस्तार मिमी में, हमेशा मीट्रिक। |
| metrics.pallet_positions_eur | integer | null | बिल्ड EUR पैलेट पोजीशन। जब लेआउट मापने के लिए बहुत बड़ा हो तो null। |
| metrics.total_weight_kg | number | रखे गए वजन, हमेशा किलोग्राम में। |
| metrics.overlaps | integer | आपस में घुसने वाले जोड़े — वैध लेआउट के लिए हमेशा 0। |
| items[].placed | boolean | क्या आइटम लेआउट में शामिल हुआ। |
| items[].x / y / z | number | null | अनुरोध इकाइयों में स्थिति: x दरवाजे के सिरे से, y बाईं दीवार से, z फर्श से। जब placed गलत हो तो तीनों null होते हैं। |
| items[].rotation_deg / tilt_deg | 0 | 90 | ओरिएंटेशन: ऊर्ध्वाधर अक्ष के चारों ओर घुमाव; tilt = लेटा हुआ। |
| items[].length / width / height / weight | number | आइटम जैसा सबमिट किया गया, अनुरोध इकाइयों में दोहराया गया। |
| plan_url | string | null | ऐप में बनाया गया प्लान। सैंडबॉक्स जॉब के लिए null। |
वर्जनिंग और स्थिरता
कॉन्ट्रैक्ट पथ (/api/v1/) में वर्जन किया गया है। v1 के भीतर, परिवर्तन केवल जोड़ने वाले होते हैं — नए वैकल्पिक अनुरोध फ़ील्ड, नए प्रतिक्रिया फ़ील्ड, नए वाहन कोड और त्रुटि कोड दिखाई दे सकते हैं, और क्लाइंट को उन फ़ील्ड्स को अनदेखा करना चाहिए जिन्हें वे नहीं पहचानते। मौजूदा फ़ील्ड कभी भी अर्थ या प्रकार नहीं बदलते, और कुछ भी हटाया नहीं जाता। एक ब्रेकिंग परिवर्तन का मतलब एक नया वर्जन पथ है, जिसमें v1 को कम से कम 12 महीनों तक समानांतर रूप से बनाए रखा जाता है और सक्रिय कुंजी वाले हर वर्कस्पेस को ईमेल द्वारा डिप्रिकेशन नोटिस भेजा जाता है।
अनुरोध फ़ील्ड्स
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
| vehicle | string | नीचे दी गई तालिकाओं से एक वाहन कोड। या {customVehicleId} पास करें (आपके वर्कस्पेस फ्लीट से एक वाहन)। |
| 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 किया जाएगा, हस्ताक्षरित (वेबहुक देखें)। |
आइटम फ़ील्ड्स
| फ़ील्ड | प्रकार | विवरण |
|---|---|---|
| length / width / height | number, required | आइटम आयाम, अनुरोध की इकाइयों में पढ़े जाते हैं (डिफ़ॉल्ट mm, "units": "imperial" के साथ इंच)। |
| weight | number, required | आइटम वजन (डिफ़ॉल्ट kg, "units": "imperial" के साथ lb)। |
| 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 के माध्यम से काम करते हैं।
ट्रक और ट्रेलर
| कोड | वाहन | आंतरिक माप (L×W×H) | भार क्षमता |
|---|---|---|---|
| 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 |
कंटेनर
| कोड | कंटेनर | आंतरिक माप (L×W×H) | भार क्षमता |
|---|---|---|---|
| 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 |
एक्सेस स्तर और सीमाएँ
| सैंडबॉक्स (हर प्लान) | प्रोडक्शन (एंटरप्राइज) | |
|---|---|---|
| कॉल्स | 25 सफल / माह | 5,000 सफल पैक / माह |
| मैनिफेस्ट प्रति आइटम | 20 | 5,000 |
| समवर्ती जॉब्स | 1 | 10 |
| ऑप्टिमाइजेशन बजट | 10 सेकंड | 30 सेकंड डिफ़ॉल्ट, अधिकतम 300 सेकंड |
| स्थायित्व | कुछ भी संग्रहीत नहीं | हर पैक से आपके वर्कस्पेस में एक वास्तविक प्लान बनता है |
केवल सफल पैक की गिनती होती है — विफल सत्यापन और विफल कार्य कभी कोटा के विरुद्ध बिल नहीं करते। दोनों काउंटर 1 तारीख (UTC) को रीसेट होते हैं। सैंडबॉक्स के परिणाम पूर्ण और बिना किसी सीमा के होते हैं — सीमाएँ केवल गेट होती हैं, आउटपुट नहीं। 5,000 पैक प्रति माह से अधिक चाहिए? वॉल्यूम और OEM मूल्य निर्धारण के लिए हमसे संपर्क करें।
वेबहुक
जॉब पूरा होने पर परिणाम POST के माध्यम से प्राप्त करने के लिए callback_url पास करें। हर कॉलबैक में X-Hansatic-Signature होता है: आपके कुंजी के वेबहुक सीक्रेट (कुंजी निर्माण के समय एक बार दिखाया गया) के साथ रॉ बॉडी का HMAC-SHA256। इसे वेरिफाई करें:
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));
}डिलीवरी एक प्रयास के साथ 5 सेकंड के टाइमआउट के साथ होती है — status_url हमेशा सत्य का स्रोत बना रहता है।
त्रुटियाँ
सभी त्रुटियाँ { "error": { "code", "message", ... } } होती हैं — मशीन-readable कोड, मानव-readable संदेश, और field जब कोई विशिष्ट इनपुट दोषपूर्ण हो।
| कोड | HTTP | अर्थ |
|---|---|---|
| invalid_key | 401 | गायब, गलत प्रारूप या रद्द की गई एपीआई कुंजी। |
| invalid_json | 400 | बॉडी वैध JSON नहीं है। |
| invalid_vehicle | 400 | अज्ञात वाहन कोड / {customVehicleId}। |
| 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 | प्रोडक्शन मोड के लिए एंटरप्राइज प्लान आवश्यक है। सैंडबॉक्स का उपयोग करें, या अपग्रेड करें। |
| sandbox_limit_reached | 402 | मासिक सैंडबॉक्स कोटा समाप्त — 1 तारीख को रीसेट होता है। |
| quota_exceeded | 402 | मासिक उत्पादन कोटा 5,000 पैक का उपयोग हो चुका है — 1 तारीख को रीसेट होगा। अधिक वॉल्यूम के लिए: हमसे संपर्क करें। |
| too_many_jobs | 429 | समवर्ती जॉब सीमा पूरी हो गई। चल रहे जॉब्स को पोल करें और पुनः प्रयास करें। |
| not_found | 404 | इस वर्कस्पेस के लिए ऐसा कोई जॉब नहीं है। |
सवाल, उच्च सीमाएँ, या कोई कनेक्टर चाहिए (Zapier, Excel, MCP)? hello@hansatic.com