Logistic Families
Introduction
Logistic families allow operators to categorize products according to their shipping and handling constraints. For example, you can create families for fragile items, oversized goods, hazardous materials, or standard parcels. These categories are then used by the delivery module to apply appropriate shipping rules and carrier selection.
This guide explains how to create and manage logistic families via the DJUST API.
Key Concepts
What is a Logistic Family
A logistic family is a grouping label that describes a class of products with similar shipping constraints. Each family has:
| Field | Description | Rules |
|---|---|---|
id | Unique identifier | Auto-generated or custom. Immutable after creation. |
name | Display name | Required. Can be updated. |
description | Optional description | Can be updated. |
Default Family
A system-managed "Default" logistic family exists on every tenant. It cannot be created, modified, or deleted via the API. Products not explicitly assigned to a family belong to this default family.
Classification Category Attachment
Logistic families can be associated with classification categories to define which shipping rules apply to which product categories. A classification category can only be attached to one logistic family at a time. If a category is already attached to another family, it is automatically detached from the previous one and reassigned to the new family.
Creating or updating a family does not automatically attach categories to it — use the dedicated endpoint described below.
Logistic Families on Orders
Cart Split at Checkout
At checkout, the cart is split into logistic orders based on the triplet (supplier, shipping delay, logistic family). A cart that mixes several logistic families for the same supplier and the same shipping delay therefore produces one logistic order per family.
The family of each line is resolved from the classification of its product, with a fallback to the "Default" logistic family when no explicit attachment exists.
flowchart LR
%% Styles (Readme)
classDef create fill:#e8f1ff,stroke:#2f6feb,stroke-width:2px,color:#0b3d91;
classDef read fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b;
classDef decision fill:#fff4e5,stroke:#f59e0b,stroke-width:2px,color:#7a3e00;
classDef place fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d;
classDef sys fill:#f2f4f7,stroke:#475569,stroke-width:2px,color:#111827;
A["🧾 Cart at checkout"]:::sys
B{{"📦 Group by<br>supplier + shipping delay<br>+ logistic family"}}:::decision
C["✅ Logistic order<br>Family A"]:::place
D["✅ Logistic order<br>Family B"]:::place
A --> B
B --> C
B --> D
style A rx:8,ry:8
style C rx:8,ry:8
style D rx:8,ry:8
Logistic Family Fields on Order Responses
The consultation responses of a logistic order (both Front Office and Back Office) carry the resolved family at the root level:
| Field | Type | Description |
|---|---|---|
logisticFamilyId | string | Identifier of the logistic family applied to the logistic order |
logisticFamilyName | string | Display name of the logistic family |
- These fields are always returned, whether or not the shipping module is enabled.
- Commercial orders — which may regroup several logistic families — are not enriched with these fields.
- Logistic orders created before this capability remain fully functional; the fields are optional and backward-compatible (they may be
nullon legacy orders without a family).
Key Endpoints
| Action | Method | Path | OperationId | Response |
|---|---|---|---|---|
| Create a logistic family | POST | /v1/logistic-families | ADM-LOGISTIC-FAMILY-100 | 201 Created |
| List logistic families | GET | /v1/logistic-families | ADM-LOGISTIC-FAMILY-550 | 200 OK |
| Get a logistic family by ID | GET | /v1/logistic-families/{id} | ADM-LOGISTIC-FAMILY-500 | 200 OK |
| Update a logistic family | PUT | /v1/logistic-families/{id} | ADM-LOGISTIC-FAMILY-200 | 204 No Content |
| Attach classification categories | PATCH | /v1/logistic-families/{logisticsFamilyId}/classification-categories | ADM-LOGISTIC-FAMILY-210 | 204 No Content |
| Get family assignments for classifications | GET | /v1/logistic-families/assignments | ADM-LOGISTIC-FAMILY-560 | 200 OK |
| List classification categories | GET | /v1/logistic-families/{logisticsFamilyId}/classification-categories | ADM-LOGISTIC-FAMILY-551 | 200 OK |
All endpoints require dj-client: OPERATOR and dj-api-key headers.
Creating a Logistic Family
POST /v1/logistic-families
dj-client: OPERATOR
dj-api-key: {{apiKey}}
Content-Type: application/jsonRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
id | string | No | Custom identifier. Auto-generated if omitted. Immutable after creation. Must be unique. |
name | string | Yes | Display name of the family |
description | string | No | Description of the family |
Example
{
"id": "fragile-items",
"name": "Fragile Items",
"description": "Products requiring careful handling and special packaging"
}Response — 201 Created
{
"id": "fragile-items",
"name": "Fragile Items",
"description": "Products requiring careful handling and special packaging"
}Updating a Logistic Family
Updates apply a full replacement of the modifiable fields (name and description). The id is immutable and cannot be changed.
PUT /v1/logistic-families/{id}
dj-client: OPERATOR
dj-api-key: {{apiKey}}
Content-Type: application/jsonRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Updated display name |
description | string | No | Updated description |
Example
{
"name": "Fragile & Delicate Items",
"description": "Products requiring careful handling, special packaging, and temperature control"
}Response — 204 No Content
No response body.
Listing Logistic Families
Retrieve a paginated list of logistic families with optional filters and sorting.
GET /v1/logistic-families
dj-client: OPERATOR
dj-api-key: {{apiKey}}Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number (0-based). Default: 0 |
size | integer | No | Number of items per page. Default: 20 |
sort | string | No | Format: field:direction (e.g. name:asc) |
search | string | No | Free-text search matched against both name and externalId (partial match, OR logic, case- and accent-insensitive). Replaces the former name parameter. |
classificationCategoryIds | string | No | Comma-separated classification category IDs to filter by |
createdAtFrom | datetime | No | Filter by creation date (inclusive, from) |
createdAtTo | datetime | No | Filter by creation date (inclusive, to) |
updatedAtFrom | datetime | No | Filter by update date (inclusive, from) |
updatedAtTo | datetime | No | Filter by update date (inclusive, to) |
Warning: Thenamequery parameter has been replaced by the unifiedsearchparameter, which matches on both the name and the external ID — the same behavior as on theclassification-categorieslist endpoint. Integrations still sendingnamemust migrate tosearch.
Response — 200 OK
{
"content": [
{
"id": "fragile-items",
"name": "Fragile Items",
"description": "Products requiring careful handling and special packaging",
"system": false,
"classificationCategoriesCount": 3,
"createdAt": "2026-03-05T10:30:00Z",
"updatedAt": "2026-03-05T10:30:00Z"
},
{
"id": "default",
"name": "Default",
"description": null,
"system": true,
"classificationCategoriesCount": 12,
"createdAt": "2026-01-10T08:00:00Z",
"updatedAt": "2026-01-10T08:00:00Z"
}
],
"number": 0,
"size": 20,
"numberOfElements": 2,
"first": true,
"last": true,
"empty": false
}
Tip: Thesystemflag identifies the system-managed "Default" family (true), andclassificationCategoriesCountgives the number of classification categories attached to each family without additional lookups.
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | F-E-032 | Missing or invalid authentication token |
| 403 | F-E-030 | Caller is not OPERATOR |
For the complete list of error codes, refer to Error / Warning codes.
Attaching Classification Categories
Attach one or more classification categories to a logistic family using their external IDs. This determines which shipping rules apply to products in those categories.
PATCH /v1/logistic-families/{logisticsFamilyId}/classification-categories
dj-client: OPERATOR
dj-api-key: {{apiKey}}
Content-Type: application/jsonRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
classificationCategoryIds | string[] | Yes | List of classification category external IDs to attach |
Rules
- A classification category can only belong to one logistic family at a time. If a category is already attached to another family, it is automatically reassigned.
- Sending an empty array or
nullforclassificationCategoryIdsreturns204with no changes applied. - Identifiers must be external IDs of classification categories.
Example
{
"classificationCategoryIds": ["CAT-FRAGILE", "CAT-GLASS"]
}Response — 204 No Content
No response body.
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | F-E-032 | Missing or invalid authentication token |
| 403 | F-E-030 | Caller is not OPERATOR |
| 404 | F-E-002 | Logistic family or classification category not found |
For the complete list of error codes, refer to Error / Warning codes.
Listing Classification Categories of a Logistic Family
Retrieve the classification categories currently attached to a logistic family. The response is paginated using the standard DJUST pagination parameters (page, size).
By default, when no explicit category attachment has been made, all tenant classification categories are implicitly associated with the "Default" logistic family. This endpoint returns them all in that case.
The id field returned for each category corresponds to the external ID of the classification category.
GET /v1/logistic-families/{logisticsFamilyId}/classification-categories
dj-client: OPERATOR
dj-api-key: {{apiKey}}Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer | No | Page number (0-based). Default: 0 |
size | integer | No | Number of items per page. Default: 20 |
Response — 200 OK
{
"content": [
{
"id": "CAT-FRAGILE",
"name": "Fragile Items"
},
{
"id": "CAT-GLASS",
"name": "Glassware"
}
],
"totalElements": 2,
"totalPages": 1,
"number": 0,
"size": 20
}Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | F-E-032 | Missing or invalid authentication token |
| 403 | F-E-030 | Caller is not OPERATOR |
| 404 | F-E-002 | Logistic family not found |
Getting Logistic Family Assignments for Classifications
Query which logistic family is currently assigned to a set of classification categories. This is useful for displaying current assignments in a UI or for checking before reassigning a category.
GET /v1/logistic-families/assignments?classificationCategoryIds=cat-001,cat-002
dj-client: OPERATOR
dj-api-key: {{apiKey}}Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
classificationCategoryIds | string (comma-separated) | Yes | List of classification category IDs to look up |
Rules
- Every classification always has a logistic family (at minimum the system default) — the response is never
nullfor a known category. - Unknown classification IDs are silently omitted from the response (Tolerant Reader pattern).
- The
systemflag in each response item indicates whether the family is the system-managed default (true) or a custom family (false). - This endpoint is not paginated — it returns all results in a single response.
Response — 200 OK
[
{
"classificationCategoryId": "cat-001",
"logisticFamilyId": "fragile-items",
"logisticFamilyName": "Fragile Items",
"system": false
},
{
"classificationCategoryId": "cat-002",
"logisticFamilyId": "default",
"logisticFamilyName": "Default",
"system": true
}
]
Tip: Use this endpoint as a pre-check before reassigning a category. If a category is already attached to a non-system family different from your target, you may want to warn the user before proceeding.
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | F-E-032 | Missing or invalid authentication token |
| 403 | F-E-030 | Caller is not OPERATOR or missing LOGISTIC_FAMILY_READ permission |
For the complete list of error codes, refer to Error / Warning codes.
Typical Workflow
flowchart LR %% Styles (Readme) classDef create fill:#e8f1ff,stroke:#2f6feb,stroke-width:2px,color:#0b3d91; classDef read fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b; classDef update fill:#e0f7fa,stroke:#06b6d4,stroke-width:2px,color:#0c4a6e; classDef add fill:#ecfdf5,stroke:#10b981,stroke-width:2px,color:#064e3b; classDef remove fill:#fee2e2,stroke:#ef4444,stroke-width:2px,color:#7f1d1d; classDef decision fill:#fff4e5,stroke:#f59e0b,stroke-width:2px,color:#7a3e00; classDef place fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d; classDef sys fill:#f2f4f7,stroke:#475569,stroke-width:2px,color:#111827; classDef ok fill:#ecfdf5,stroke:#10b981,stroke-width:2px,color:#064e3b; classDef stop fill:#fee2e2,stroke:#ef4444,stroke-width:2px,color:#7f1d1d; A["➕ Create logistic family<br>POST /v1/logistic-families"]:::create B["📦 Family available"]:::place F["📘 Check current assignments<br>GET .../assignments"]:::read C["🔗 Attach categories<br>PATCH .../classification-categories"]:::add D["🔄 Update family<br>PUT /v1/logistic-families/id"]:::update E["📘 List categories<br>GET .../classification-categories"]:::read A --> B --> F --> C B --> D --> B B --> E style A rx:8,ry:8 style B rx:8,ry:8 style C rx:8,ry:8 style D rx:8,ry:8 style E rx:8,ry:8 style F rx:8,ry:8
Best Practices
- Use meaningful custom IDs — if you provide a custom
id, make it descriptive and consistent (e.g.fragile-items,oversized-goods). Once created, the ID cannot be changed. - Plan your family structure — define your logistic families before attaching categories. Rethinking the structure later requires reassigning categories.
- Do not modify the Default family — it is system-managed and serves as the fallback for unassigned products.
Common Mistakes
| Mistake | Consequence | How to avoid |
|---|---|---|
| Trying to modify the Default family | Request will be rejected | The Default family is system-managed and cannot be updated |
| Expecting category attachment on creation | Categories are not linked automatically | Use ADM-LOGISTIC-FAMILY-210 to attach categories after creating the family |
| Attaching a category already assigned to another family | The category is silently reassigned to the new family | Verify current assignments before attaching if you need to preserve existing links |
Sending id in an update request | The id field is immutable | Only send name and description in the update body |
| Using a duplicate custom ID | 409 Conflict or validation error | Ensure IDs are unique across all logistic families |
Error Reference
For the complete list of DJUST error and warning codes, refer to the dedicated page:
Error / Warning codes
Related Documentation
- Shipping Zones and Types
- Shipping Price Matrix
- Order Lifecycle and Statuses
- Introduction to DJUST OMS
Updated 28 days ago

