पैकिंग एपीआई

कार्गो सबमिट करें और एक ऑप्टिमाइज़्ड, भौतिक रूप से वैध लोड प्लान प्राप्त करें — प्लेसमेंट, लोडिंग मीटर, लीनियर फीट और बिल्ड पैलेट पोजीशन। यह वही इंजन है जो ऐप के पीछे काम करता है, वास्तविक डिस्पैचर लेआउट के विरुद्ध निरंतर पुष्टि की गई। हर प्लान पर सैंडबॉक्स एक्सेस; एंटरप्राइज पर प्रोडक्शन एक्सेस।

त्वरित शुरुआत

  1. साइन इन करें → अपने नाम पर क्लिक करें → एपीआई → एक कुंजी जनरेट करें।
  2. एक पैक जॉब सबमिट करें (यह सैंडबॉक्स में चलेगा — हर प्लान पर मुफ्त):
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_countintegerकितने आइटम फिट हुए / नहीं फिट हुए।
units"metric" | "imperial"वे इकाइयाँ जिनमें नीचे दी गई सभी संख्याएँ व्यक्त की गई हैं (अनुरोध के अनुसार)।
metrics.ldm_mnumberलोडिंग मीटर — कार्गो ब्लॉक का विस्तार (अधिकतम अंत − न्यूनतम शुरुआत)।
metrics.linear_ftnumberवही विस्तार लीनियर फीट में (US LTL)।
metrics.span_mmintegerविस्तार मिमी में, हमेशा मीट्रिक।
metrics.pallet_positions_eurinteger | nullबिल्ड EUR पैलेट पोजीशन। जब लेआउट मापने के लिए बहुत बड़ा हो तो null।
metrics.total_weight_kgnumberरखे गए वजन, हमेशा किलोग्राम में।
metrics.overlapsintegerआपस में घुसने वाले जोड़े — वैध लेआउट के लिए हमेशा 0।
items[].placedbooleanक्या आइटम लेआउट में शामिल हुआ।
items[].x / y / znumber | nullअनुरोध इकाइयों में स्थिति: x दरवाजे के सिरे से, y बाईं दीवार से, z फर्श से। जब placed गलत हो तो तीनों null होते हैं।
items[].rotation_deg / tilt_deg0 | 90ओरिएंटेशन: ऊर्ध्वाधर अक्ष के चारों ओर घुमाव; tilt = लेटा हुआ।
items[].length / width / height / weightnumberआइटम जैसा सबमिट किया गया, अनुरोध इकाइयों में दोहराया गया।
plan_urlstring | nullऐप में बनाया गया प्लान। सैंडबॉक्स जॉब के लिए null।

वर्जनिंग और स्थिरता

कॉन्ट्रैक्ट पथ (/api/v1/) में वर्जन किया गया है। v1 के भीतर, परिवर्तन केवल जोड़ने वाले होते हैं — नए वैकल्पिक अनुरोध फ़ील्ड, नए प्रतिक्रिया फ़ील्ड, नए वाहन कोड और त्रुटि कोड दिखाई दे सकते हैं, और क्लाइंट को उन फ़ील्ड्स को अनदेखा करना चाहिए जिन्हें वे नहीं पहचानते। मौजूदा फ़ील्ड कभी भी अर्थ या प्रकार नहीं बदलते, और कुछ भी हटाया नहीं जाता। एक ब्रेकिंग परिवर्तन का मतलब एक नया वर्जन पथ है, जिसमें v1 को कम से कम 12 महीनों तक समानांतर रूप से बनाए रखा जाता है और सक्रिय कुंजी वाले हर वर्कस्पेस को ईमेल द्वारा डिप्रिकेशन नोटिस भेजा जाता है।

अनुरोध फ़ील्ड्स

फ़ील्डप्रकारविवरण
vehiclestringनीचे दी गई तालिकाओं से एक वाहन कोड। या {customVehicleId} पास करें (आपके वर्कस्पेस फ्लीट से एक वाहन)।
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 किया जाएगा, हस्ताक्षरित (वेबहुक देखें)।

आइटम फ़ील्ड्स

फ़ील्डप्रकारविवरण
length / width / heightnumber, requiredआइटम आयाम, अनुरोध की इकाइयों में पढ़े जाते हैं (डिफ़ॉल्ट mm, "units": "imperial" के साथ इंच)।
weightnumber, requiredआइटम वजन (डिफ़ॉल्ट kg, "units": "imperial" के साथ lb)।
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 के माध्यम से काम करते हैं।

ट्रक और ट्रेलर

कोडवाहनआंतरिक माप (L×W×H)भार क्षमता
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

कंटेनर

कोडकंटेनरआंतरिक माप (L×W×H)भार क्षमता
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

एक्सेस स्तर और सीमाएँ

सैंडबॉक्स (हर प्लान)प्रोडक्शन (एंटरप्राइज)
कॉल्स25 सफल / माह5,000 सफल पैक / माह
मैनिफेस्ट प्रति आइटम205,000
समवर्ती जॉब्स110
ऑप्टिमाइजेशन बजट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_key401गायब, गलत प्रारूप या रद्द की गई एपीआई कुंजी।
invalid_json400बॉडी वैध JSON नहीं है।
invalid_vehicle400अज्ञात वाहन कोड / {customVehicleId}।
invalid_items400किसी आइटम फ़ील्ड में कमी है, गैर-संख्यात्मक है, या सीमा से बाहर है।
suspicious_dimensions400सभी आयाम 100mm से कम — संभवतः इंच को mm के रूप में भेजा गया। "units": "imperial" पास करें।
invalid_units400units "metric" या "imperial" होना चाहिए।
invalid_objective400objective "ldm" या "pallets" होना चाहिए।
invalid_callback400callback_url https होना चाहिए।
too_many_items400मैनिफेस्ट आपके एक्सेस स्तर की आइटम सीमा से अधिक है।
upgrade_required402प्रोडक्शन मोड के लिए एंटरप्राइज प्लान आवश्यक है। सैंडबॉक्स का उपयोग करें, या अपग्रेड करें।
sandbox_limit_reached402मासिक सैंडबॉक्स कोटा समाप्त — 1 तारीख को रीसेट होता है।
quota_exceeded402मासिक उत्पादन कोटा 5,000 पैक का उपयोग हो चुका है — 1 तारीख को रीसेट होगा। अधिक वॉल्यूम के लिए: हमसे संपर्क करें।
too_many_jobs429समवर्ती जॉब सीमा पूरी हो गई। चल रहे जॉब्स को पोल करें और पुनः प्रयास करें।
not_found404इस वर्कस्पेस के लिए ऐसा कोई जॉब नहीं है।

सवाल, उच्च सीमाएँ, या कोई कनेक्टर चाहिए (Zapier, Excel, MCP)? hello@hansatic.com