Inventory
Spare parts, consumables, and provisioning stock.
POST
/inventoryCreate an inventory item
Requires `vesselId` and `itemType`. Accepts either `vesselSystemId` or `category` (the server derives whichever is omitted); neither is required for provisions/consumables not tied to a system.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| vesselId | string (uuid) | required | — |
| itemType | enum(spare_part | safety_equipment | consumable | provision | interior | exterior | cleaning | tools | electronics | medical | lines_rigging | navigation | tender_equipment | water_toys | other) | required | — |
| name | string | required | — |
| vesselSystemId | string (uuid) | optional | — |
| category | string | optional | — |
| quantity | integer | optional | — |
| unit | string | optional | — |
| location | string | optional | — |
| partNumber | string | optional | — |
| costPerUnit | string | optional | Serialized as string to preserve Decimal precision. |
| currency | string | optional | — |
| supplier | string | optional | — |
| reorderThreshold | integer | optional | — |
| expirationDate | string (date-time) | optional | — |
| notes | string | optional | — |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | object | required | — |
| data.id | string (uuid) | optional | — |
| data.vesselId | string (uuid) | optional | — |
| data.vesselSystemId | string (uuid) | null | optional | — |
| data.vesselSystem | object | null | optional | — |
| data.vesselSystem.id | string (uuid) | optional | — |
| data.vesselSystem.systemKey | string | optional | — |
| data.vesselSystem.name | string | optional | — |
| data.itemType | string | optional | InventoryType enum, e.g. spare_part, safety_equipment, consumable, provision. |
| data.name | string | optional | — |
| data.category | string | null | optional | — |
| data.subcategory | string | null | optional | — |
| data.quantity | integer | optional | — |
| data.unit | string | null | optional | — |
| data.location | string | null | optional | — |
| data.deckLevel | string | null | optional | — |
| data.section | string | null | optional | — |
| data.partNumber | string | null | optional | — |
| data.fitsEquipment | array<string> | optional | — |
| data.brand | string | null | optional | — |
| data.model | string | null | optional | — |
| data.costPerUnit | string | null | optional | Serialized as string to preserve Decimal precision. |
| data.currency | string | optional | — |
| data.supplier | string | null | optional | — |
| data.reorderThreshold | integer | null | optional | — |
| data.reorderQuantity | integer | null | optional | — |
| data.autoReorderEnabled | boolean | optional | — |
| data.preferredSupplierId | string (uuid) | null | optional | — |
| data.expirationDate | string (date-time) | null | optional | — |
| data.barcode | string | null | optional | — |
| data.photo | string | null | optional | — |
| data.notes | string | null | optional | — |
| data.sourceDescription | string | null | optional | — |
| data.catalogPartId | string (uuid) | null | optional | — |
| data.dataHealthFlags | array<object> | optional | Derived data-quality warnings for this row (e.g. missing reorder threshold). |
| data.hasOpenAutoDraft | boolean | optional | Whether a suppressed purchase-order auto-draft exists for this item's low-stock trigger. |
| data.vessel | object | optional | — |
| data.vessel.id | string (uuid) | optional | — |
| data.vessel.vesselName | string | optional | — |
| data.createdAt | string (date-time) | optional | — |
| data.updatedAt | string (date-time) | optional | — |
GET
/inventory/{id}Get an inventory item
Returns a single inventory item with vessel and vessel-system summaries.
Path parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string (uuid) | required | — |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | object | required | — |
| data.id | string (uuid) | optional | — |
| data.vesselId | string (uuid) | optional | — |
| data.vesselSystemId | string (uuid) | null | optional | — |
| data.vesselSystem | object | null | optional | — |
| data.vesselSystem.id | string (uuid) | optional | — |
| data.vesselSystem.systemKey | string | optional | — |
| data.vesselSystem.name | string | optional | — |
| data.itemType | string | optional | InventoryType enum, e.g. spare_part, safety_equipment, consumable, provision. |
| data.name | string | optional | — |
| data.category | string | null | optional | — |
| data.subcategory | string | null | optional | — |
| data.quantity | integer | optional | — |
| data.unit | string | null | optional | — |
| data.location | string | null | optional | — |
| data.deckLevel | string | null | optional | — |
| data.section | string | null | optional | — |
| data.partNumber | string | null | optional | — |
| data.fitsEquipment | array<string> | optional | — |
| data.brand | string | null | optional | — |
| data.model | string | null | optional | — |
| data.costPerUnit | string | null | optional | Serialized as string to preserve Decimal precision. |
| data.currency | string | optional | — |
| data.supplier | string | null | optional | — |
| data.reorderThreshold | integer | null | optional | — |
| data.reorderQuantity | integer | null | optional | — |
| data.autoReorderEnabled | boolean | optional | — |
| data.preferredSupplierId | string (uuid) | null | optional | — |
| data.expirationDate | string (date-time) | null | optional | — |
| data.barcode | string | null | optional | — |
| data.photo | string | null | optional | — |
| data.notes | string | null | optional | — |
| data.sourceDescription | string | null | optional | — |
| data.catalogPartId | string (uuid) | null | optional | — |
| data.dataHealthFlags | array<object> | optional | Derived data-quality warnings for this row (e.g. missing reorder threshold). |
| data.hasOpenAutoDraft | boolean | optional | Whether a suppressed purchase-order auto-draft exists for this item's low-stock trigger. |
| data.vessel | object | optional | — |
| data.vessel.id | string (uuid) | optional | — |
| data.vessel.vesselName | string | optional | — |
| data.createdAt | string (date-time) | optional | — |
| data.updatedAt | string (date-time) | optional | — |
PATCH
/inventory/{id}Update an inventory item
Partial update — any writable `InventoryItem` field. `category` and `vesselSystemId` are dual-accept (supplying one derives the other when possible).
Path parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| id | path | string (uuid) | required | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | optional | — |
| vesselSystemId | string (uuid) | null | optional | — |
| category | string | null | optional | — |
| quantity | integer | optional | — |
| unit | string | null | optional | — |
| location | string | null | optional | — |
| costPerUnit | string | null | optional | Serialized as string to preserve Decimal precision. |
| currency | string | optional | — |
| reorderThreshold | integer | null | optional | — |
| notes | string | null | optional | — |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | object | required | — |
| data.id | string (uuid) | optional | — |
| data.vesselId | string (uuid) | optional | — |
| data.vesselSystemId | string (uuid) | null | optional | — |
| data.vesselSystem | object | null | optional | — |
| data.vesselSystem.id | string (uuid) | optional | — |
| data.vesselSystem.systemKey | string | optional | — |
| data.vesselSystem.name | string | optional | — |
| data.itemType | string | optional | InventoryType enum, e.g. spare_part, safety_equipment, consumable, provision. |
| data.name | string | optional | — |
| data.category | string | null | optional | — |
| data.subcategory | string | null | optional | — |
| data.quantity | integer | optional | — |
| data.unit | string | null | optional | — |
| data.location | string | null | optional | — |
| data.deckLevel | string | null | optional | — |
| data.section | string | null | optional | — |
| data.partNumber | string | null | optional | — |
| data.fitsEquipment | array<string> | optional | — |
| data.brand | string | null | optional | — |
| data.model | string | null | optional | — |
| data.costPerUnit | string | null | optional | Serialized as string to preserve Decimal precision. |
| data.currency | string | optional | — |
| data.supplier | string | null | optional | — |
| data.reorderThreshold | integer | null | optional | — |
| data.reorderQuantity | integer | null | optional | — |
| data.autoReorderEnabled | boolean | optional | — |
| data.preferredSupplierId | string (uuid) | null | optional | — |
| data.expirationDate | string (date-time) | null | optional | — |
| data.barcode | string | null | optional | — |
| data.photo | string | null | optional | — |
| data.notes | string | null | optional | — |
| data.sourceDescription | string | null | optional | — |
| data.catalogPartId | string (uuid) | null | optional | — |
| data.dataHealthFlags | array<object> | optional | Derived data-quality warnings for this row (e.g. missing reorder threshold). |
| data.hasOpenAutoDraft | boolean | optional | Whether a suppressed purchase-order auto-draft exists for this item's low-stock trigger. |
| data.vessel | object | optional | — |
| data.vessel.id | string (uuid) | optional | — |
| data.vessel.vesselName | string | optional | — |
| data.createdAt | string (date-time) | optional | — |
| data.updatedAt | string (date-time) | optional | — |
GET
/inventory/vessel/{vesselId}List a vessel's inventory
Supports `?cursor=` pagination on the standard path only — the `status=lowstock` filter (raw SQL comparing `quantity` to `reorderThreshold`) is a bounded result set and does not support cursor.
Path parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| vesselId | path | string (uuid) | required | — |
Query parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| cursor | query | string | optional | Opaque pagination cursor from a previous response's `pagination.cursor`. Omit this param entirely for the first page of cursor mode; pass `cursor=` (empty) is also accepted as "start from the beginning in cursor mode." Omitting `cursor` altogether (not even as an empty string) falls back to legacy `?page=` semantics on endpoints that still support it. |
| limit | query | integer | optional | — |
Response
| Field | Type | Required | Description |
|---|---|---|---|
| data | array<object> | required | — |
| data[].id | string (uuid) | optional | — |
| data[].vesselId | string (uuid) | optional | — |
| data[].vesselSystemId | string (uuid) | null | optional | — |
| data[].vesselSystem | object | null | optional | — |
| data[].vesselSystem.id | string (uuid) | optional | — |
| data[].vesselSystem.systemKey | string | optional | — |
| data[].vesselSystem.name | string | optional | — |
| data[].itemType | string | optional | InventoryType enum, e.g. spare_part, safety_equipment, consumable, provision. |
| data[].name | string | optional | — |
| data[].category | string | null | optional | — |
| data[].subcategory | string | null | optional | — |
| data[].quantity | integer | optional | — |
| data[].unit | string | null | optional | — |
| data[].location | string | null | optional | — |
| data[].deckLevel | string | null | optional | — |
| data[].section | string | null | optional | — |
| data[].partNumber | string | null | optional | — |
| data[].fitsEquipment | array<string> | optional | — |
| data[].brand | string | null | optional | — |
| data[].model | string | null | optional | — |
| data[].costPerUnit | string | null | optional | Serialized as string to preserve Decimal precision. |
| data[].currency | string | optional | — |
| data[].supplier | string | null | optional | — |
| data[].reorderThreshold | integer | null | optional | — |
| data[].reorderQuantity | integer | null | optional | — |
| data[].autoReorderEnabled | boolean | optional | — |
| data[].preferredSupplierId | string (uuid) | null | optional | — |
| data[].expirationDate | string (date-time) | null | optional | — |
| data[].barcode | string | null | optional | — |
| data[].photo | string | null | optional | — |
| data[].notes | string | null | optional | — |
| data[].sourceDescription | string | null | optional | — |
| data[].catalogPartId | string (uuid) | null | optional | — |
| data[].dataHealthFlags | array<object> | optional | Derived data-quality warnings for this row (e.g. missing reorder threshold). |
| data[].hasOpenAutoDraft | boolean | optional | Whether a suppressed purchase-order auto-draft exists for this item's low-stock trigger. |
| data[].vessel | object | optional | — |
| data[].vessel.id | string (uuid) | optional | — |
| data[].vessel.vesselName | string | optional | — |
| data[].createdAt | string (date-time) | optional | — |
| data[].updatedAt | string (date-time) | optional | — |
| pagination | object | optional | Canonical cursor-pagination block. On endpoints not yet retrofitted for true cursor support, `cursor` is a best-effort display-only value (not decodable, no `?cursor=` branch accepts it back) — see each endpoint's description for whether it has full cursor support. |
| pagination.cursor | string | null | optional | Opaque token for the next page, or `null` when `hasMore` is `false`. |
| pagination.limit | integer | required | — |
| pagination.hasMore | boolean | required | — |
| pagination.total | integer | required | Total row count matching the filter (not just this page). |
