Pakkaus-API
Lähetä lasti, saat takaisin optimoidun, fyysisesti pätevän lastaussuunnitelman — sijoitukset, kuormametrit, lineaarimetrit ja laskutettavat lava-asemat. Sama moottori kuin sovelluksessa, validoitu jatkuvasti tosielämän lähettäjien suunnitelmien perusteella. Sandbox-käyttö jokaisella suunnitelmalla; tuotantokäyttö Enterprise-suunnitelmalla.
Pika-aloitus
- Kirjaudu sisään → klikkaa nimeäsi → API → luo avain.
- Lähetä pakkauspyyntö (tämä suoritetaan sandbox-tilassa — ilmainen jokaisella suunnitelmalla):
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-..."
}Tarkista status_url (sama autentikointiotsake) kunnes status on "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/..."
}
}Rajapintakutsut
POST /api/v1/pack
Validoi ja lisää pakkauspyyntö jonoon. Palauttaa 202 ja job_id. Tukee Idempotency-Key-otsaketta — saman avaimen uudelleenlähetykset palauttavat alkuperäisen pyynnön sen sijaan, että lastaus suoritettaisiin kahdesti.
GET /api/v1/jobs/{id}
Työn tila ja, kun valmis, koko tulos. Tulokset säilytetään 30 päivää; tuotantosuunnitelmien tulokset tallennetaan työtilaasi pysyvästi.
GET /api/v1/openapi.json
Koneellisesti luettava OpenAPI 3.1 -määrittely — tuo se Postmaniin, koodigeneraattoreihin tai ohjaa AI-koodityökalusi sen avulla. Ajoneuvokoodit haetaan reaaliaikaisesta moottorista, joten määrittely on aina ajantasainen. Avaa määrittely ↗
Vastauksen kentät
Valmiin työn result-objekti:
| Kenttä | Tyyppi | Kuvaus |
|---|---|---|
| placed_count / unplaced_count | integer | Kuinka monta tavaraa mahtui / ei mahtunut. |
| units | "metric" | "imperial" | Yksiköt, joissa kaikki alla olevat numerot ilmaistaan (toistaa pyynnön). |
| metrics.ldm_m | number | Kuormametrit — lastin ulottuvuus (maksimi loppu − minimi alku). |
| metrics.linear_ft | number | Sama ulottuvuus lineaarimetreinä (USA:n LTL). |
| metrics.span_mm | integer | Ulottuvuus millimetreinä, aina metrisenä. |
| metrics.pallet_positions_eur | integer | null | Laskutettavat EUR-lava-asemat. null, jos asettelu on liian suuri mitattavaksi. |
| metrics.total_weight_kg | number | Sijoitettu paino, aina kilogrammoina. |
| metrics.overlaps | integer | Päällekkäiset parit — aina 0 pätevässä asettelussa. |
| items[].placed | boolean | Mahtuiko tavara asetteluun. |
| items[].x / y / z | number | null | Sijainti pyynnön yksiköissä: x ovesta päin, y vasemmasta seinästä, z lattiasta. Kaikki kolme ovat null, jos placed on false. |
| items[].rotation_deg / tilt_deg | 0 | 90 | Suunta: kierto pystyakselin ympäri; tilt = kyljelleen asetettu. |
| items[].length / width / height / weight | number | Tavaran mitat pyynnössä, toistettu pyynnön yksiköissä. |
| plan_url | string | null | Luotu suunnitelma sovelluksessa. null sandbox-tilan töissä. |
Versiointi ja vakaus
Sopimus on versioitu polussa (/api/v1/). Versiossa v1 muutokset ovat vain lisäyksiä — uusia valinnaisia pyyntökenttiä, uusia vastauskenttiä, uusia ajoneuvokoodeja ja virhekoodeja voi ilmestyä, ja asiakkaiden tulee ohittaa kentät, joita ne eivät tunnista. Olemassa olevien kenttien merkitys tai tyyppi ei koskaan muutu, eikä mitään poisteta. Rikkova muutos tarkoittaa uutta versiopolkua, ja v1:tä ylläpidetään rinnakkain vähintään 12 kuukauden ajan, ja poistosta ilmoitetaan sähköpostitse jokaiselle työtilalle, jolla on aktiivinen avain.
Pyynnön kentät
| Kenttä | Tyyppi | Kuvaus |
|---|---|---|
| vehicle | string | Ajoneuvokoodi alla olevista taulukoista. Vaihtoehtoisesti voit käyttää {customVehicleId}-tunnusta (ajoneuvo työtilasi kalustosta). |
| objective | "ldm" | "pallets" | Minimoi kuormametrit tai laskutettavat lava-asemat. Oletusarvo "ldm". |
| units | "metric" | "imperial" | Miten tavaran mitat ja painot tulkitaan JA palautetaan: mm/kg (oletus) tai in/lb. Vastauksen sijainnit noudattavat samoja yksiköitä. |
| items | array, required | Lastiluettelo (alla olevat kentät). |
| sandbox | boolean | Testitila: täysi tulos, mitään ei tallenneta. Saatavilla jokaisella suunnitelmalla. |
| name | string | Suunnitelman nimi (tuotantotila). |
| ldm_limit_m | number | Rajoita kuorma ensimmäisiin N kuormametriin (kuorma-autot). |
| budget_ms | number | Optimoinnin aikaraja (tuotanto; oletus 30000, maksimi 300000). |
| callback_url | https URL | POSTataan tulos, kun työ on valmis, allekirjoitettuna (katso Webhookit). |
Tavaran kentät
| Kenttä | Tyyppi | Kuvaus |
|---|---|---|
| length / width / height | number, required | Tavaran mitat, tulkitaan pyynnön yksiköissä (mm oletuksena, tuumissa, jos "units": "imperial"). |
| weight | number, required | Tavaran paino (kg oletuksena, pauna, jos "units": "imperial"). |
| quantity | integer, default 1 | Laajenee yksittäisiksi kappaleiksi. |
| name | string, optional | Näkyy suunnitelmassa ja vastauksessa. |
| stackable | boolean, default true | Voiko tämän tavaran päälle lastata muuta. |
| max_stack | number, optional | Maksimipaino, jonka tavara kestää päällään (samat yksiköt kuin paino). |
| fragile | boolean, default false | Haurastavara sijoitetaan vain ylimpiin kerroksiin. |
| tiltable | boolean, default true | Voiko tavaran asettaa kyljelleen. |
| destination_stop | integer, default 1 | Toimitusasema moniasemakuormauksessa (LIFO). |
Ajoneuvokoodit
Luotu reaaliaikaisen moottorin määrittelyistä. Työtilasi kaluston mukautetut ajoneuvot toimivat custom_vehicle_id-tunnuksen avulla.
Kuorma-autot ja perävaunut
| Koodi | Ajoneuvo | Sisämitat (P×L×K) | Kuormakapasiteetti |
|---|---|---|---|
| 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 |
Kontit
| Koodi | Kontti | Sisämitat (P×L×K) | Kuormakapasiteetti |
|---|---|---|---|
| 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 |
Käyttöoikeustasot ja rajat
| Sandbox (jokaisella suunnitelmalla) | Tuotanto (Enterprise) | |
|---|---|---|
| Kutsut | 25 onnistunutta / kuukausi | 5 000 onnistunutta kuormaa / kuukausi |
| Tavaroita luettelossa | 20 | 5,000 |
| Samanaikaiset työt | 1 | 10 |
| Optimoinnin aikaraja | 10 s | 30 s oletus, enintään 300 s |
| Tallennus | Mitään ei tallenneta | Jokainen pakkaus luo oikean suunnitelman työtilaasi |
Vain onnistuneet kuormat lasketaan — epäonnistuneet validoinnit ja työt eivät vaikuta kiintiöön. Molemmat laskurit nollaantuvat 1. päivänä (UTC). Sandbox-tulokset ovat täysin toimivia ja rajoittamattomia — rajat koskevat vain kutsukertoja, ei tuloksia. Tarvitsetko yli 5 000 kuormaa kuukaudessa? Kysy meiltä volyymi- ja OEM-hinnoista.
Webhookit
Anna callback_url saadaksesi tuloksen POSTina, kun työ on valmis. Jokainen kutsu sisältää X-Hansatic-Signature:n, joka on HMAC-SHA256 allekirjoitus raakaruumiista avaimesi webhook-salaisuudella (näytetään kerran avaimen luonnin yhteydessä). Vahvista se:
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));
}Toimitus on yksi yritys 5s aikakatkaisulla — status_url säilyy aina totuuden lähteenä.
Virheet
Kaikki virheet ovat { "error": { "code", "message", ... } }-muotoisia — koneellisesti luettava koodi, ihmisluettava viesti ja field, jos tietty syöttökenttä on virheellinen.
| Koodi | HTTP | Merkitys |
|---|---|---|
| invalid_key | 401 | Puuttuva, virheellinen tai peruutettu API-avain. |
| invalid_json | 400 | Runko ei ole kelvollinen JSON. |
| invalid_vehicle | 400 | Tuntematon ajoneuvokoodi / {customVehicleId}. |
| invalid_items | 400 | Tavaran kenttä puuttuu, ei ole numeerinen tai on alueen ulkopuolella. |
| suspicious_dimensions | 400 | Kaikki mitat alle 100 mm — todennäköisesti tuumat lähetetty millimetreinä. Käytä "units": "imperial". |
| invalid_units | 400 | units-tunnuksen on oltava "metric" tai "imperial". |
| invalid_objective | 400 | objective-tunnuksen on oltava "ldm" tai "pallets". |
| invalid_callback | 400 | callback_url:n on oltava https. |
| too_many_items | 400 | Luettelo ylittää tavararajan käyttöoikeustasollesi. |
| upgrade_required | 402 | Tuotantotila vaatii Enterprise-suunnitelman. Käytä sandbox-tilaa tai päivitä. |
| sandbox_limit_reached | 402 | Kuukausittainen sandbox-käyttöraja täynnä — nollautuu 1. päivänä. |
| quota_exceeded | 402 | Kuukausittainen tuotantokiintiö (5 000 kuormaa) käytetty — nollaantuu 1. päivänä. Suuremmat volyymit: ota yhteyttä. |
| too_many_jobs | 429 | Samanaikaisten töiden raja saavutettu. Tarkista käynnissä olevat työt ja yritä uudelleen. |
| not_found | 404 | Tätä työtä ei ole tässä työtilassa. |
Kysymyksiä, korkeammat rajat tai tarvitsemasi liitin (Zapier, Excel, MCP)? hello@hansatic.com