Pak-API
Stuur vrag in, kry 'n geoptimaliseerde, fisies geldige laaiplan terug — plasings, laaimeters, lineêre voete en gefaktureerde palletposisies. Dieselfde enjin agter die app, deurlopend gevalideer teen werklike dispatseruitlegte. Sandbox-toegang op elke pakket; produksietoegang op Enterprise.
Vinnige begin
- Meld aan → klik op jou naam → API → genereer 'n sleutel.
- Stuur 'n pakopdrag in (hierdie een loop in sandbox — gratis op elke pakket):
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-..."
}Vra die status_url op (dieselfde autentiseringskop) totdat status "done" is:
{
"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/..."
}
}Eindpunte
POST /api/v1/pack
Valideer en plaas 'n pakopdrag in die waglys. Gee 202 terug met 'n job_id. Ondersteun 'n Idempotency-Key-kop — herhalings met dieselfde sleutel gee die oorspronklike opdrag terug in plaas daarvan om twee keer te pak.
GET /api/v1/jobs/{id}
Opdragstatus en, wanneer voltooi, die volledige resultaat. Resultate word vir 30 dae behou; produksieplanne bly permanent in jou werkruimte.
GET /api/v1/openapi.json
Die masjienleesbare OpenAPI 3.1-kontrak — voer dit in Postman, kodegenerators in, of wys jou KI-koderingstool daarna. Voertuigkodes word vanuit die lewende enjin ingevoeg, dus is dit altyd aktueel. Bekyk die spesifikasie ↗
Antwoordvelde
Die result-objek by 'n voltooide opdrag:
| Veld | Tipe | Beskrywing |
|---|---|---|
| placed_count / unplaced_count | integer | Hoeveel items pas / het nie gepas nie. |
| units | "metric" | "imperial" | Die eenhede waarin alle onderstaande getalle uitgedruk word (weerklank van die versoek). |
| metrics.ldm_m | number | Laaimeters — die vragblok se omvang (maks. einde − min. begin). |
| metrics.linear_ft | number | Dieselfde omvang in lineêre voete (VS LTL). |
| metrics.span_mm | integer | Die omvang in mm, altyd metries. |
| metrics.pallet_positions_eur | integer | null | Gefaktureerde EUR-palletposisies. null as die uitleg te groot is om te meet. |
| metrics.total_weight_kg | number | Geplaasde gewig, altyd in kg. |
| metrics.overlaps | integer | Deurdringende pare — altyd 0 vir 'n geldige uitleg. |
| items[].placed | boolean | Of die item in die uitleg geplaas is. |
| items[].x / y / z | number | null | Posisie in versoekenhede: x vanaf die deurkant, y vanaf die linkermuur, z vanaf die vloer. Al drie is null as placed vals is. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Oriëntasie: rotasie om die vertikale as; tilt = op sy kant gelê. |
| items[].length / width / height / weight | number | Die item soos ingedien, weergegee in versoekenhede. |
| plan_url | string | null | Die aangemaakte plan in die app. null vir sandbox-opdragte. |
Weergawes & stabiliteit
Die kontrak word in die pad (/api/v1/) geïwersioneer. Binne v1 is veranderinge slegs additief — nuwe opsionele versoekvelde, nuwe antwoordvelde, nuwe voertuigkodes en foutkodes mag verskyn, en kliënte moet velde ignoreer wat hulle nie herken nie. Bestaande velde verander nooit van betekenis of tipe nie, en niks word verwyder nie. 'n Onderbrekende verandering beteken 'n nuwe weergawepad, met v1 wat minstens 12 maande parallel onderhou word en 'n afkondigingskennisgewing per e-pos aan elke werkruimte met 'n aktiewe sleutel gestuur word.
Versoekvelde
| Veld | Tipe | Beskrywing |
|---|---|---|
| vehicle | string | 'n Voertuigkode uit die onderstaande tabelle. Of gee custom_vehicle_id ( 'n voertuig uit jou werksruimtevloot) deur. |
| objective | "ldm" | "pallets" | Minimeer laaimeters, of minimeer gefaktureerde palletposisies. Verstek "ldm". |
| units | "metric" | "imperial" | Hoe itemafmetings en -gewigte gelees EN teruggestuur word: mm/kg (verstek) of duim/pond. Posisies in die antwoord volg dieselfde eenhede. |
| items | array, required | Die vragmanifes (velde hieronder). |
| sandbox | boolean | Toetsmodus: volledige resultaat, niks word gestoor nie. Beskikbaar op elke pakket. |
| name | string | Plannaam (produksiemodus). |
| ldm_limit_m | number | Beperk die vrag tot die eerste N laaimeters (vragmotors). |
| budget_ms | number | Optimaliseringstydbegroting (produksie; verstek 30000, maks. 300000). |
| callback_url | https URL | Word gepos na die resultaat wanneer die opdrag voltooi is, geteken (sien Webhooks). |
Itemvelde
| Veld | Tipe | Beskrywing |
|---|---|---|
| length / width / height | number, required | Itemafmetings, gelees in die versoek se eenhede (mm by verstek, duim met "units": "imperial"). |
| weight | number, required | Itemgewig (kg by verstek, pond met "units": "imperial"). |
| quantity | integer, default 1 | Word in individuele eenhede uitgebrei. |
| name | string, optional | Word in die plan en die antwoord vertoon. |
| stackable | boolean, default true | Mag ander vrag bo-op hierdie item geplaas word. |
| max_stack | number, optional | Maksimum gewig wat hierdie item bo-op kan dra (dieselfde eenhede as gewig). |
| fragile | boolean, default false | Breekbare items word slegs op boonste lae geplaas. |
| tiltable | boolean, default true | Mag die item op sy kant gelê word. |
| destination_stop | integer, default 1 | Afleweringsstop vir multi-stop LIFO-laai. |
Voertuigkodes
Gegenereer vanuit die lewende enjinspesifikasies. Pasgemaakte voertuie uit jou werksruimtevloot werk via custom_vehicle_id.
Vragmotors & sleepwaens
| Kode | Voertuig | Binne-afmetings (L×B×H) | Laaivermoë |
|---|---|---|---|
| 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 |
Houers
| Kode | Houer | Binne-afmetings (L×B×H) | Laaivermoë |
|---|---|---|---|
| 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 |
Toegangsvlakke & perke
| Sandbox (elke pakket) | Produksie (Enterprise) | |
|---|---|---|
| Oproepe | 25 suksesvol / maand | 5 000 suksesvolle pakkies / maand |
| Items per manifes | 20 | 5,000 |
| Gelyktydige opdragte | 1 | 10 |
| Optimaliseringsbegroting | 10 s | 30 s verstek, tot 300 s |
| Bewaring | Niks gestoor | Elke pakopdrag skep 'n werklike plan in jou werkruimte |
Slegs suksesvolle pakkies tel — mislukte validasies en mislukte take word nooit teen 'n kwota aangerek nie. Albei tellers herstel op die 1ste (UTC). Sandbox-resultate is volledig en onbeperk — die limiete is die poort, nie die uitset nie. Behoefte aan meer as 5 000 pakkies per maand? Praat met ons oor volume- en OEM-pryse.
Webhooks
Gee callback_url deur om die resultaat via POST te ontvang wanneer die opdrag voltooi is. Elke terugroep bevat X-Hansatic-Signature: 'n HMAC-SHA256 van die rou lyf met jou sleutel se webhook-geheim (eenmalig by sleutel skepping vertoon). Verifieer dit:
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));
}Aflewering is een poging met 'n 5s-tydperk — die status_url bly altyd die bron van waarheid.
Foute
Alle foute is { "error": { "code", "message", ... } } — masjienleesbare kode, mensleesbare boodskap, en field wanneer 'n spesifieke invoer foutief is.
| Kode | HTTP | Betekenis |
|---|---|---|
| invalid_key | 401 | Ontbrekende, misvormde of herroepte API-sleutel. |
| invalid_json | 400 | Liggaam is nie geldige JSON nie. |
| invalid_vehicle | 400 | Onbekende voertuigkode / custom_vehicle_id. |
| invalid_items | 400 | 'n Itemveld ontbreek, is nie-numeries, of buite bereik. |
| suspicious_dimensions | 400 | Alle afmetings onder 100 mm — waarskynlik duim as mm gestuur. Gee "units": "imperial" deur. |
| invalid_units | 400 | units moet "metric" of "imperial" wees. |
| invalid_objective | 400 | objective moet "ldm" of "pallets" wees. |
| invalid_callback | 400 | callback_url moet https wees. |
| too_many_items | 400 | Manifes oorskry die itemperk vir jou toegangsvlak. |
| upgrade_required | 402 | Produksiemodus vereis die Enterprise-pakket. Gebruik sandbox, of gradeer op. |
| sandbox_limit_reached | 402 | Maandelikse sandbox-toelae opgebruik — herstel op die 1ste. |
| quota_exceeded | 402 | Maandelikse produksiekwota van 5 000 pakkies gebruik — herstel op die 1ste. Groter volume: kontak ons. |
| too_many_jobs | 429 | Gelyktydige opdragperk bereik. Vra lopende opdragte op en probeer weer. |
| not_found | 404 | Geen sodanige opdrag vir hierdie werkruimte nie. |
Vrae, hoër perke, of 'n aansluiting wat jy nodig het (Zapier, Excel, MCP)? hello@hansatic.com