TCS Innovations Logo

API Reference

v2.1.0 • RESTful Architecture • JSON Encoded

Introduction

The TCS-i API is organized around REST. Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.

Base URL: All API requests should be made to our primary integration gateway: https://api.tcs-innovations.com

Authentication

The TCS-i API uses API keys to authenticate requests. Onboarded accounts can view and manage their API keys in the TCS-i Console. Not onboarded yet? Join the early access waitlist from the top menu.

Authentication to the API is performed via the x-api-key HTTP header. All API requests must be made over HTTPS.

// Example Authentication Header
curl -X POST https://api.tcs-innovations.com/pack \
  -H "Content-Type: application/json" \
  -H "x-api-key: your_production_api_key_here"

POST

/pack

Computes a highly optimized 3D packing solution (cartonization) based on your provided inventory items, available bins, and specific objective targets.

Request Body

metadataoptionalobject

Custom metadata dictionary to be passed along with the packing request.

itemsrequiredarray of objects

The list of products to be packed. See the Item Data Model for property requirements.

binsoptional*array of objects

Required for standard packing. Can be omitted if objective is minimise_bounding_box.

objectiveoptionalstring

Defaults to minimise_bins. See Objectives model for full list.

constraintsoptionalobject

Defines physics rules: rotation logic, fragility limits, center of gravity checks, buffer units, and forbidden adjacencies.

cost_modeloptionalobject

Used when objective is set to minimise_total_cost. Defines shipping base rates, per-kg rates, and DIM divisors to evaluate the most cost-effective packaging.

// POST /pack Payload Example
{
  "objective": "minimise_total_cost",
  "items": [
    { "id": "I-001", "length": 2.0, "width": 4.0, "height": 4.0, "weight": 1.5, "label": "electronics", "is_cylinder": false },
    { "id": "I-002", "length": 5.0, "width": 5.0, "height": 2.0, "weight": 0.5, "label": "accessories", "is_cylinder": true }
  ],
  "bins": [
    { "id": "B-001", "length": 10.0, "width": 10.0, "height": 10.0, "is_envelope": false, "fixed_cost": 2.0, "tare_weight": 0.2, "quantity": 2 }
  ],
  "constraints": {
    "rotation": true,
    "fragility": ["I-001"],
    "weight_distribution": {
      "max_per_layer": 10.0,
      "footprint": 5.0,
      "center_of_gravity": true,
      "min_support_ratio": 0.8
    },
    "forbidden_adjacency": [["electronics", "liquids"]],
    "priority": ["I-001"]
  },
  "cost_model": {
    "ship_base": 0.6,
    "ship_rate_per_kg": 1.1,
    "dim_divisor": 5000.0,
    "dunnage_cost_per_volume": 0.05
  }
}
// Response Example
{
  "solution": {
    "num_bins_used": 1,
    "bins": [
      {
        "id": "B-001",
        "length": 10.0, "width": 10.0, "height": 10.0,
        "items": [
          {
            "id": "I-001",
            "origin_dims": [2.0, 4.0, 4.0],
            "rotation_instruction": "perm(0, 1, 2)",
            "rotated_dims": [2.0, 4.0, 4.0],
            "position": [0.0, 0.0, 0.0],
            "is_cylinder": false
          },
          {
            "id": "I-002",
            "origin_dims": [5.0, 5.0, 2.0],
            "rotation_instruction": "perm(0, 2, 1)",
            "rotated_dims": [5.0, 2.0, 5.0],
            "position": [2.0, 0.0, 0.0],
            "is_cylinder": true
          }
        ]
      }
    ],
    "packed_item_ids": ["I-001", "I-002"],
    "unpacked_item_ids": []
  }
}

Packing Data Models

Objective Parameter

minimise_bins(Default) Packs all items into the absolute fewest number of provided bins.
minimise_unused_spaceSelects bins that leave the least empty volume (reduces dunnage).
maximise_itemsAttempts to fit as many items as possible into limited bins.
minimise_bin_costsOptimizes packing to minimize total bin material cost (`fixed_cost`).
minimise_total_costRequires cost_model object. Optimizes for cheapest shipping + material spend.
minimise_bounding_boxSynthesizes a custom bin to discover the absolute smallest cubic volume possible.
minimise_missing_heightGiven fixed base (length/width), find the minimum required height.

Constraints Object

rotationbooleanDefault true. Allows the engine to rotate items in 3D space.
fragilityarray of strArray of Item IDs. The engine will mathematically guarantee no other items are stacked on top of these.
fragile_buffer_*floatGlobal buffering rules for fragile items (cm_per_side, volume).
dimension_unit*stringOptionally defines universal parsing rules (dimension_unit, dimension_unit_source).
weight_distributionobjectControls structural weight limits. Requires item weight. Subfields:
  • max_per_layer (float): limits total weight per horizontal layer.
  • footprint (float): limits vertical load per footprint/cell.
  • center_of_gravity (boolean): enforces stable center-of-gravity support.
  • min_support_ratio (float): requires a minimum supported base area fraction (0 to 1).
forbidden_adjacencyarray of arrPairs of Item labels that cannot touch. e.g. [["Food", "Chemicals"]]
priorityarray of strList of Item IDs that should be packed first if bin capacity is limited.
max_bin_limitintegerHard limit on the maximum number of bins the engine is allowed to use.

Cost Model Object

ship_basefloatBase shipping cost per used bin.
ship_rate_per_kgfloatCourier cost applied per kg (uses item weights + bin tare weight).
dim_divisorfloatDimensional weight divisor (e.g. 4000 or 5000). Set to 0 to disable DIM logic.
dunnage_cost_per_volumefloatPenalty cost applied per unit of unused volume space inside a packed bin.

Item Object

id *stringUnique identifier (e.g., SKU).
namestringOptional human-readable name for the item.
length/width/height *float > 0Physical dimensions of the item.
weightfloat >= 0Required if weight_distribution constraints apply.
labelstringCategory label used for forbidden_adjacency routing.
is_cylinderbooleanTriggers complex geometry nesting logic for circular items.
is_flexiblebooleanIndicates if the item is flexible/malleable.
is_fragilebooleanIndicates if the item needs a protective buffer.
can_use_envelopebooleanAllows the item to be packed into mailing envelopes/bags.
can_rotatebooleanItem-specific rotation override.
buffer_*float/stringConfigure physical buffering (per_side, cm_per_side, volume, source, unit).

Bin Object

idstringUnique box/mailer ID.
namestringOptional human-readable name for the bin.
length/width/heightfloat > 0Internal dimensions of the packing container.
is_envelopebooleanIf true, algorithm treats L/W as flat malleable mailer dimensions.
fixed_costfloat >= 0Material cost, targeted by minimise_bin_costs.
tare_weightfloat >= 0Empty weight of the bin itself. Used in cost models.
quantityint >= 1Inventory limitation for this specific box size.

POST

/slot

Sub-200ms Dynamic Slotting Engine with Smart Cascade & Fast-Track. Intercepts inbound WMS dock scans in real-time. Calculates global SKU velocity against rolling hourly picks to dynamically route items to the Golden, Silver, or Dead Zones.

Request Body

skurequiredSlotSKU Object

Details about the incoming item, including its rolling hourly pick history for velocity calculation.

warehouse_contextrequiredSlotWarehouseContext Object

Thresholds for zone classifications and multi-bin drain support rules.

bin_optionsrequiredSlotBinOptions Object

The current home bin (if any) and available empty bins for the engine to consider.

// POST /slot Payload Example
{
  "sku": {
    "sku_id": "SKU-992-BLK",
    "length": 10.0,
    "width": 10.0,
    "height": 10.0,
    "rolling_hourly_picks": [10, 15, 8, 45]
  },
  "warehouse_context": {
    "site_id": "wh_uk_london_01",
    "golden_zone_velocity_threshold_per_hour": 30.0,
    "silver_zone_velocity_threshold_per_hour": 15.0,
    "multi_bin_drain_supported": true,
    "dim_unit": "cm"
  },
  "bin_options": {
    "current_home_bin": {
      "bin_id": "RES-09-02",
      "zone": "Dead Zone",
      "available_volume": 100.0,
      "current_quantity_left": 50
    },
    "empty_bins": [
      {
        "bin_id": "A-04-12",
        "zone": "Silver Zone",
        "available_volume": 500.0,
        "current_quantity_left": 0
      }
    ]
  }
}
// Response Example
{
  "meta": {
    "request_id": "req-8x7d6c5b4a",
    "sku_id": "SKU-992-BLK",
    "decision_code": "UPGRADE_CONSOLIDATE",
    "status": 200
  },
  "allocations": [
    {
      "bin_id": "A-04-12",
      "role": "new_primary",
      "action": "putaway",
      "inbound_putaway_qty": 120,
      "sweep_in_qty": 50,
      "sweep_out_qty": 0,
      "total_expected_qty": 170
    },
    {
      "bin_id": "RES-09-02",
      "role": "old_home",
      "action": "sweep_out",
      "inbound_putaway_qty": 0,
      "sweep_in_qty": 0,
      "sweep_out_qty": 50,
      "total_expected_qty": 0
    }
  ],
  "telemetry": {
    "trend_classification": "FAST_TRACK_SILVER",
    "calculated_slow_velocity": 12.5,
    "calculated_fast_velocity": 22.6,
    "calculated_velocity_ratio": 1.8,
    "golden_threshold_applied": 30.0,
    "silver_threshold_applied": 15.0,
    "target_zone": "silver",
    "assigned_zone": "silver"
  }
}

Slotting Data Models

SlotSKU Object (Request)

sku_idstringUnique identifier for the incoming item.
length/width/heightfloat > 0Physical dimensions of the item. Must be sent together.
is_cylinder/is_flexible/is_fragile/can_rotatebooleanHandling characteristics of the SKU.
labelstringCategory label for bin restrictions.
rolling_hourly_picksarray of integersChronological array of picks per hour used to compute sustained vs. immediate velocity rates.

SlotWarehouseContext Object (Request)

site_id *stringWarehouse this decision applies to.
golden_zone_velocity_threshold_per_hourfloatMinimum hourly picks required to classify an item into the high-priority Golden Zone.
silver_zone_velocity_threshold_per_hourfloatMinimum hourly picks required for the Silver Zone.
multi_bin_drain_supportedbooleanIf true, allows system to support "systemic drain" downgrades instead of forcing physical sweep-outs.
dim_unitstringUnit for all lengths. Defaults to "cm". Converted to cm on input.

SlotBin & SlotBinOptions Objects (Request)

bin_idstringIdentifier for the physical bin location.
zonestringMust match "Golden Zone", "Silver Zone", or "Dead Zone".
available_volumefloatRemaining physical space in the bin.
length/width/heightfloat > 0Physical dimensions of the bin. Must be sent together.
current_quantity_leftintegerAmount of the SKU currently existing in this bin (Defaults to 0 for empty bins).

SlotMeta Object (Returned in Response)

request_idstringUnique identifier for the request.
sku_idstringIdentifier for the item that was processed.
decision_codestringResulting logic path (e.g., "MAINTAIN_TOPUP", "UPGRADE_CONSOLIDATE", "DOWNGRADE_SWEEP").
statusintegerHTTP-style status code representing success (200) or failure (400 if no bins fit).

SlotAllocation Object (Returned in Response)

bin_idstringThe optimal WMS physical location for this action.
rolestringIndicates if the bin is "primary", "new_primary", or "old_home".
actionstringTask directive (e.g., "putaway", "sweep_out", "systemic_drain").
inbound_putaway_qtyintegerAmount of new inbound stock to route to this bin.
sweep_in_qty / sweep_out_qtyintegerUnits moved between an old home bin and a new primary bin during consolidation.
total_expected_qtyintegerExpected total inventory in this bin after the directed actions are completed.

SlotTelemetry Object (Returned in Response)

trend_classificationstringSystem evaluation of pick velocity (e.g., "FAST_TRACK_SILVER", "VELOCITY_HIGH").
calculated_slow_velocityfloatSustained average picks-per-hour calculated by the engine based on recent data.
calculated_fast_velocityfloatImmediate burst velocity based on the most recent intervals.
calculated_velocity_ratiofloatRatio of fast velocity over slow velocity, used for trend classifications.
golden_threshold_appliedfloatThe golden threshold value utilized during this calculation.
silver_threshold_appliedfloatThe silver threshold value utilized during this calculation.
target_zonestringThe zone the algorithm ideally targeted before checking physical bin constraints.
assigned_zonestringThe final zone assigned after reviewing physical constraints and bin options.

POST

/v1/pallet-packing/solve

Computes a 3D packing solution for loading items onto a pallet. Calculates center of gravity, manages stackability constraints, handles interlock patterns, and accounts for pallet capacity limits.

Request Body

job_idrequiredstring

Unique tracking ID for this packing operation.

unitsrequiredUnits Object

Declares the dimension (e.g. "cm") and mass (e.g. "kg") units shared by all geometry in the request.

itemsrequiredarray of ItemRequests

The inventory requiring placement onto the pallet.

palletrequiredPalletRequest Object

Dimensions and limitations of the target pallet.

policyoptionalPolicyRequest Object

Physics rules: support ratios, edge clearance, and interlock requirements.

solver_optionsoptionalSolverOptions Object

Deterministic search controls for search depth and Large Neighborhood Search parameters.

// POST /v1/pallet-packing/solve Example
{
  "job_id": "PAL-8819",
  "units": { "dimension": "cm", "mass": "kg" },
  "pallet": {
    "pallet_id": "EUR-EPAL",
    "dimensions": { "length": 120.0, "width": 80.0, "height": 14.4 },
    "deck_height": 14.4,
    "tare_mass": 25.0,
    "max_payload": 1500.0,
    "max_load_height": 180.0,
    "usable_area": { "x": 0, "y": 0, "length": 120.0, "width": 80.0 }
  },
  "items": [
    {
      "item_id": "ITEM-01",
      "dimensions": { "length": 40.0, "width": 30.0, "height": 30.0 },
      "mass": 12.5,
      "allowed_orientations": ["upright"],
      "bottom_required": false,
      "stackable": true,
      "can_support_load": true,
      "max_top_load": 50.0
    }
  ]
}
// Response Example
{
  "schema_version": "1.0",
  "job_id": "PAL-8819",
  "status": "FEASIBLE",
  "summary": {
    "items_requested": 1,
    "items_placed": 1,
    "total_height": 44.4,
    "gross_mass": 37.5
  },
  "placements": [
    {
      "item_id": "ITEM-01",
      "orientation_id": "upright",
      "position": { "x": 0.0, "y": 0.0, "z": 0.0 },
      "absolute_cog": { "x": 20.0, "y": 15.0, "z": 29.4 }
    }
  ]
}

Pallet Packing Models

ItemRequest Object

item_id *stringUnique identifier for the item. Must not contain duplicates.
dimensions / mass *object / floatPhysical properties of the item.
allowed_orientations *array of stringsAccepted rotations for placement.
bottom_required *booleanWhen true, item must sit on the pallet deck.
stackable *booleanItem may be placed above another item when true.
can_support_load *booleanItem may carry other items on top of it when true.
max_top_load *floatMaximum supported cumulative top load.

PalletRequest Object

pallet_id *stringUnique identifier for the pallet.
dimensions / deck_height *object / floatOuter bounds and the height from the pallet base to the deck surface.
tare_mass / max_payload *floatEmpty pallet mass and maximum cargo mass allowance.
max_load_height *floatMaximum cargo height above the deck.
usable_area *Rectangle objectUsable XY rectangle on the deck.

POST

/v1/loading

Optimizes the placement of grouped handling units (e.g. pallets, master cartons) into vehicles, containers, or trailers to maximize payload efficiency and check physical limits.

Request Body

job_idoptionalstring

Reference identifier for tracking this loading operation.

vehiclerequiredVehicle Object

Dimensions and payload limits of the truck or container.

handling_unitsrequiredarray of HandlingUnit Objects

Items requiring placement. Must contain at least one item.

dimension_unit / weight_unitoptionalstring

Define measurement bases. dimension_unit defaults to "cm" (accepts "mm", "cm", "m", "in"). weight_unit defaults to "kg" (accepts "kg", "lb").

// POST /v1/loading Example
{
  "job_id": "LOAD-099",
  "vehicle": {
    "vehicle_id": "TRUCK-1",
    "internal_length": 1360.0,
    "internal_width": 245.0,
    "internal_height": 270.0,
    "max_payload_weight": 24000.0
  },
  "handling_units": [
    {
      "handling_unit_id": "PALLET-A",
      "length": 120.0,
      "width": 80.0,
      "height": 150.0,
      "weight": 600.0,
      "quantity": 12,
      "stackable": false,
      "rotatable": true
    }
  ],
  "dimension_unit": "cm",
  "weight_unit": "kg"
}
// Response Example
{
  "job_id": "LOAD-099",
  "status": "stub",
  "message": "Loading strategy successfully generated",
  "vehicle_id": "TRUCK-1",
  "loaded_units": [
    { "handling_unit_id": "PALLET-A", "quantity": 12 }
  ],
  "unloaded_units": [],
  "safety_summary": {
    "total_weight": 7200.0,
    "max_payload_weight": 24000.0,
    "weight_within_limit": true,
    "estimated_volume_utilization": 38.4,
    "warnings": []
  },
  "warnings": []
}

Container Loading Models

Vehicle Object

vehicle_id *stringUnique identifier for the vehicle.
internal_length/width/height *float > 0Payload bay internal dimensions.
max_payload_weightfloat > 0Total permitted cargo weight scale.

HandlingUnit Object

handling_unit_id *stringIdentifier for the pallet/master carton.
length/width/height *float > 0Dimensions of the unit.
weight *float >= 0Physical scale weight.
quantityinteger >= 1Inventory quantity. Defaults to 1.
stackablebooleanIndicates if other units can be stacked on top.
rotatablebooleanIndicates if the unit can be rotated in placement.

Telemetry & Preferences

We use essential cookies to secure your session and analytics to optimize performance. Read our Privacy Policy.