Warehouses
Returns every warehouse on the tenant — across all statuses (active / inactive / archived) — paginated.
Query
search(optional) — substring (ILIKE) match onnameORwarehouse_code, case-insensitive.skip/take(optional) — standard offset pagination; defaults toskip = 0,take = 20.
The response items intentionally omit the heavyweight inventory-page extras (custom-column values, location detail, creator info). Use GET /custom-columns/:id to load detail when you need everything.
Substring (ILIKE) match on name OR warehouse_code, case-insensitive.
020Tenant id (uuid v4)
Returned when the rate limit is exceeded
GET /api/v1/public/warehouses HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Accept: */*
{
"meta": {
"total": 1,
"lastPage": 1,
"currentPage": 1,
"perPage": 1,
"prev": 1,
"next": 1
},
"data": [
{
"id": "text",
"warehouse_code": "text",
"name": "text",
"description": "text",
"status": "active",
"purpose": "production",
"storage_type": "default",
"division_count": 1,
"created_at": "2026-01-01T00:00:00.000Z",
"created_by": {
"id": "text",
"first_name": "text",
"last_name": "text",
"avatar_id": "text"
},
"location": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"display_name": "text"
},
"custom_column_values": [
{
"custom_column_id": "text",
"value": "text"
}
]
}
]
}Creates a new warehouse on the tenant.
Notes
namemust be unique within the tenant.warehouse_codeis auto-generated when omitted (digits-only sequential id). Custom codes max 18 chars, must be unique.purposeis required and immutable in practice.wipis reserved for the system-managed in-progress warehouse and cannot be created here.statusdefaults toactive;archivedis allowed on create but soft-locks the row from non-admin edits in the FE.storage_typedefaults todefault(no divisions).divisionsis ignored unlessstorage_typeis overridden.locationis a free-form display name (max 500 chars). The server finds-or-creates awarehouse_locationsrow by that name and links the warehouse to it.latitude/longitudeare left null when the row is created through this endpoint (public API doesn't carry geo coords).
custom_column_values — what to pass
Each entry is { custom_column_id: uuid, value: ... }. The value's shape must match the referenced column's column_type (server validates the combination — bad shapes are rejected with 400):
text — string. Length bounds enforced by the column's
config.{min_chars, max_chars}.{ "custom_column_id": "uuid", "value": "Free-form note" }number — integer or float.
config.number_type = "integer"rejects decimals.{ "custom_column_id": "uuid", "value": 42 }date_time — ISO-8601 string. Shape depends on
config.time_type(date_time/date_only/time_only).{ "custom_column_id": "uuid", "value": "2026-06-18T12:00:00Z" }people — entity uuid (user / department / position id, matching
config.assignee_type), or an array for multi.{ "custom_column_id": "uuid", "value": "user-uuid" }boolean —
trueorfalse.{ "custom_column_id": "uuid", "value": true }choice —
choice_option_idforchoice_type = "single", or an array of ids for"multi".{ "custom_column_id": "uuid", "value": "choice-option-uuid" }
On update, full-reconcile semantics apply: listed columns are upserted, columns with stored values that are absent from the request are deleted.
Tenant id (uuid v4)
Optional override of the auto-generated warehouse code. Max 18 chars; must be unique within the tenant.
activePossible values: defaultPossible values: Free-form location name. The server finds-or-creates a warehouse_locations row by display_name; lat/lng default to null when the row is created here.
Auto-generated digits-only sequential code by default; admins may set free-form text up to 18 chars.
Returned when the rate limit is exceeded
POST /api/v1/public/warehouses HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 297
{
"name": "text",
"warehouse_code": "text",
"description": "text",
"status": "active",
"purpose": "production",
"storage_type": "default",
"divisions": [
{
"division_code": "text",
"name": "text"
}
],
"custom_column_values": [
{
"custom_column_id": "123e4567-e89b-12d3-a456-426614174000",
"value": "text"
}
],
"location": "text"
}{
"id": "text",
"warehouse_code": "text",
"name": "text",
"description": "text",
"status": "active",
"purpose": "production",
"storage_type": "default",
"created_at": "2026-01-01T00:00:00.000Z",
"divisions": [
{
"id": "text",
"division_code": "text",
"name": "text"
}
],
"custom_column_values": [
{
"id": "text",
"custom_column_id": "text",
"value": "text"
}
],
"location": {
"id": "text",
"place_id": "text",
"display_name": "text",
"latitude": 1,
"longitude": 1
},
"inventory_columns": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"column_type": "text",
"config": {
"min_chars": 1,
"max_chars": 1
},
"choice_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"label": "text",
"position": 1
}
],
"people_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000"
}
]
}
]
}Candidate value to check; the BE validates availability only — length/character rules are enforced by the regular create/update DTOs at submit time.
Tenant id (uuid v4)
true → value is free to use; false → another warehouse already owns it.
Returned when the rate limit is exceeded
GET /api/v1/public/warehouses/check-uniqueness?field=name&value=text HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Accept: */*
{
"is_available": true
}Returns the full warehouse record, including divisions, custom_column_values (raw stored values), and inventory_columns (definitions for every column referenced by this warehouse — join inventory_columns[].id with custom_column_values[].custom_column_id on the client).
location is currently always null for warehouses created through the public API.
Tenant id (uuid v4)
Auto-generated digits-only sequential code by default; admins may set free-form text up to 18 chars.
Returned when the rate limit is exceeded
GET /api/v1/public/warehouses/{id} HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Accept: */*
{
"id": "text",
"warehouse_code": "text",
"name": "text",
"description": "text",
"status": "active",
"purpose": "production",
"storage_type": "default",
"created_at": "2026-01-01T00:00:00.000Z",
"divisions": [
{
"id": "text",
"division_code": "text",
"name": "text"
}
],
"custom_column_values": [
{
"id": "text",
"custom_column_id": "text",
"value": "text"
}
],
"location": {
"id": "text",
"place_id": "text",
"display_name": "text",
"latitude": 1,
"longitude": 1
},
"inventory_columns": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"column_type": "text",
"config": {
"min_chars": 1,
"max_chars": 1
},
"choice_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"label": "text",
"position": 1
}
],
"people_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000"
}
]
}
]
}Hard-deletes the warehouse. Rejected if the warehouse has any related operations (production workflows). The wip warehouse cannot be deleted.
Tenant id (uuid v4)
No content
Returned when the rate limit is exceeded
DELETE /api/v1/public/warehouses/{id} HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Accept: */*
No content
Updates a warehouse. Any field not provided is left unchanged.
Notes
warehouse_codeandstorage_typeare locked once the warehouse has related operations (production workflows, etc.).descriptionacceptsnullto clear an existing value.divisionsandcustom_column_valuesuse full-reconcile semantics — listed rows are upserted, existing rows absent from the request are deleted. Pass an empty array to clear everything.location(string) finds-or-creates awarehouse_locationsrow by display name and links it. Passnullto clear the existing link; omit the field to leave it unchanged.
custom_column_values — what to pass
Each entry is { custom_column_id: uuid, value: ... }. The value's shape must match the referenced column's column_type (server validates the combination — bad shapes are rejected with 400):
text — string. Length bounds enforced by the column's
config.{min_chars, max_chars}.{ "custom_column_id": "uuid", "value": "Free-form note" }number — integer or float.
config.number_type = "integer"rejects decimals.{ "custom_column_id": "uuid", "value": 42 }date_time — ISO-8601 string. Shape depends on
config.time_type(date_time/date_only/time_only).{ "custom_column_id": "uuid", "value": "2026-06-18T12:00:00Z" }people — entity uuid (user / department / position id, matching
config.assignee_type), or an array for multi.{ "custom_column_id": "uuid", "value": "user-uuid" }boolean —
trueorfalse.{ "custom_column_id": "uuid", "value": true }choice —
choice_option_idforchoice_type = "single", or an array of ids for"multi".{ "custom_column_id": "uuid", "value": "choice-option-uuid" }
On update, full-reconcile semantics apply: listed columns are upserted, columns with stored values that are absent from the request are deleted.
Tenant id (uuid v4)
Locked once the warehouse has related operations.
Send null to clear the existing description.
Locked once the warehouse has related operations.
Pass a non-empty string to find-or-create and link, null to clear the existing link, omit to leave unchanged.
Auto-generated digits-only sequential code by default; admins may set free-form text up to 18 chars.
Returned when the rate limit is exceeded
PATCH /api/v1/public/warehouses/{id} HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 318
{
"name": "text",
"warehouse_code": "text",
"description": "text",
"status": "active",
"storage_type": "default",
"divisions": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"division_code": "text",
"name": "text"
}
],
"custom_column_values": [
{
"custom_column_id": "123e4567-e89b-12d3-a456-426614174000",
"value": "text"
}
],
"location": "text"
}{
"id": "text",
"warehouse_code": "text",
"name": "text",
"description": "text",
"status": "active",
"purpose": "production",
"storage_type": "default",
"created_at": "2026-01-01T00:00:00.000Z",
"divisions": [
{
"id": "text",
"division_code": "text",
"name": "text"
}
],
"custom_column_values": [
{
"id": "text",
"custom_column_id": "text",
"value": "text"
}
],
"location": {
"id": "text",
"place_id": "text",
"display_name": "text",
"latitude": 1,
"longitude": 1
},
"inventory_columns": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"column_type": "text",
"config": {
"min_chars": 1,
"max_chars": 1
},
"choice_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"label": "text",
"position": 1
}
],
"people_options": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"entity_id": "123e4567-e89b-12d3-a456-426614174000"
}
]
}
]
}Returns every non-deleted division belonging to the supplied warehouse. Divisions are the addressable sub-locations within a non-default-storage warehouse (bins, cells, shelves — depends on storage_type).
Response
Flat array of { id, name, division_code, warehouse_id } — small enough that no pagination is required. Warehouses whose storage_type is default return an empty array.
Notes
The
division_codeis the value clients pass on inventory-add / move endpoints underdivision_id— via theidfield.division_codeis the human-facing label.
Tenant id (uuid v4)
Short code for the division; unique within the warehouse.
Returned when the rate limit is exceeded
GET /api/v1/public/warehouses/{id}/divisions HTTP/1.1
Host: api-stage.hesh.tech
x-api-key: YOUR_API_KEY
Accept: */*
[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"division_code": "text",
"warehouse_id": "123e4567-e89b-12d3-a456-426614174000"
}
]Last updated

