Service container
A service container groups physical or virtual containers that belong to one or more service jobs. Each container holds a set of line items (articles with quantities) and is linked to a facility through its referenced service jobs. All service container operations are available through the fulfillmenttools REST API.
Service containers exist in two types:
PHYSICAL
Represents a real, physical container such as a tote or box. Always has a sequenceNumber greater than 0.
VIRTUAL
A logical grouping with no physical counterpart. Always has sequenceNumber = 0. Can't be created via the REST API, fulfillmenttools creates virtual containers automatically.
Service container creation
A service container is created manually via the REST API or automatically by fulfillmenttools when a pick job is closed. For the automatic creation flow, see the Automatic creation from pick jobs section.
The endpoint for manual creation is:
POST https://{YOUR-TENANT-NAME}.api.fulfillmenttools.com/api/servicecontainersReturns HTTP 201 on success.
serviceJobRefs
string[]
Yes
Identifiers of the service jobs this container belongs to. Between one and 50 entries, no duplicates.
lineItems
object[]
Yes
Items in this container. Maximum 50.
operativeContainerTypeRef
string
No
Identifier of the operative container type to base this container on.
nameLocalized
object
No
Localized name. Defaults to the name from the operative container type, or "Unknown Service Container".
descriptionLocalized
object
No
Localized description.
iconUrl
string
No
URL to an icon. Defaults to the value from the operative container type.
sequenceNumber
number
No
Must be greater than 0 for physical containers. If omitted, the next available number is assigned automatically.
scannableCodes
string[]
No
Barcode or Quick Response (QR) code values. Maximum 50.
storageLocationRef
string
No
Identifier of the storage location where this container resides.
stackRef
string
No
Reference to a related stack.
customAttributes
object
No
Arbitrary key-value payload. Merged on top of customAttributes from the operative container type.
dimensions
object
No
Physical dimensions. Defaults to the operative container type value.
weightLimitInG
number
No
Weight limit in grams. Defaults to the operative container type value.
previousModuleContainerInfo
object
No
Traceability link to a preceding module container, such as a load unit.
Example request body:
Example response:
Creation validations
The following validations are applied to every manual creation call.
Input validations
serviceJobRefs must contain at least one entry.
"A service container must reference at least one service job."
serviceJobRefs must not contain duplicate identifiers.
"Duplicate service job references are not allowed in a service container."
Maximum 50 serviceJobRefs.
Validation error.
Maximum 50 lineItems.
"A service container cannot have more than 50 line items."
Maximum 50 scannableCodes.
"A service container cannot have more than 50 scannable codes."
Each line item: maximum 50 recordableAttributes.
Validation error.
Each line item: maximum 50 tags.
Validation error.
Each line item: maximum 50 stickers.
Validation error.
Operative container type validations
If operativeContainerTypeRef is provided, the following additional checks apply:
The referenced operative container type must exist and be active. If its status is
INACTIVE, fulfillmenttools rejects the request with:"Creating with an inactive container type is not allowed. Inactive container type id: <id>."Its
allowedOperativeTypesmust includeSERVICE. If not, fulfillmenttools rejects the request with:"The referenced operative container type with id <id> cannot be used for service containers as it does not allow operative type SERVICE."
Sequence number uniqueness
sequenceNumber = 0is reserved for virtual containers and can't be set explicitly. fulfillmenttools rejects anysequenceNumber <= 0on a non-virtual container with:"sequenceNumber must be greater than 0. Received: <value>"The
sequenceNumbermust be unique within the combination ofserviceJobRefsand operative container type name. fulfillmenttools rejects a conflicting value with:"A service container with sequenceNumber <n> already exists for this (serviceJob, containerType) combination."If no
sequenceNumberis provided, fulfillmenttools automatically assigns the next available number.
Service container retrieval
Service container by identifier
Service containers by service job
Returns all service containers associated with the given service job.
Service container list
size
number
Yes
Number of results to return. Maximum: 500.
startAfterId
string
No
Cursor for pagination.
orderBy
string
No
Sort order. One of: SERVICE_CONTAINER_LAST_MODIFIED_ASC, SERVICE_CONTAINER_LAST_MODIFIED_DESC, SERVICE_CONTAINER_CREATED_ASC, SERVICE_CONTAINER_CREATED_DESC.
facilityRefs
string[]
No
Filter by facility identifiers.
serviceJobRef
string
No
Filter by a single service job identifier.
Example response:
Service container deletion
Returns HTTP 200 on success. The system emits a SERVICE_CONTAINER_DELETED event transactionally.
Required permissions
All service container endpoints require the caller to hold one of the following permissions:
SERVICE_JOB_READ
Read operations (GET endpoints)
SERVICE_JOB_WRITE
Write and delete operations (POST, DELETE endpoints)
Automatic creation from pick jobs
In addition to manual REST API creation, service containers are created automatically when a pick job is closed. This happens as part of the linked service jobs update flow.
Creation trigger
When a pick job transitions to status CLOSED, fulfillmenttools:
Retrieves the operative process linked to the pick job.
Finds all linked service jobs that are children of the pick job inside the operative process tree.
Creates service containers for each linked service job.
All service jobs within a single linked service jobs entity share a single set of service containers. This means the serviceJobRefs field on each container contains all service job references from the linked service jobs entity.
Container creation process
The system builds two groups of containers and creates them in one batch:
Physical containers from load units: one
PHYSICALcontainer per load unit whose operative container type supportsSERVICE, provided the load unit contains relevant line items.One virtual container (if needed): one
VIRTUALcontainer that collects all line items that either weren't placed into any load unit, or were placed into a load unit whose operative container type doesn't supportSERVICE. This container is only created if at least one such line item exists.
Containers from load units
For each load unit attached to the pick job, fulfillmenttools:
Resolves the load unit's
operativeContainerTypeRef.If the operative container type includes
SERVICEin itsallowedOperativeTypes, aPHYSICALcontainer is created and linked to that type.If the operative container type doesn't support
SERVICE, or no type is set, the load unit's line items are routed to the single virtual container instead.Maps the load unit's line items to service container line items.
Skips the load unit entirely if no relevant line items result from the mapping.
The following fields are copied from the load unit to the service container:
nameLocalized
Load unit nameLocalized
customAttributes
Load unit customAttributes, merged with the operative container type's customAttributes
scannableCodes
Load unit codes
storageLocationRef
Load unit storageLocationRef
stackRef
Load unit stackRef
descriptionLocalized
Load unit descriptionLocalized, defaults to operative container type
iconUrl
Load unit iconUrl, defaults to operative container type
weightLimitInG
Load unit weightLimitInG, defaults to operative container type
dimensions
Load unit dimensions, defaults to operative container type
previousModuleContainerInfo
Set to { type: "LOADUNIT", containerRef: <loadUnit.id> }
Line item mapping and batch picking
Each load unit line item is mapped to one or more service container line items. A special case applies when items were batch picked from different orders into the same load unit slot during a pick run:
A load unit line item can reference multiple
globalLineItemIdswhen items with the same article were batch picked from different orders.In that case, the line item is split by
globalLineItemId. The quantity for each split entry is taken from the correspondingpickLineItem.pickedvalue.In the standard case (single
globalLineItemId), the load unit line item'squantityis used directly.
Virtual container
Service containers represent the physical objects (totes, trolleys, or similar) that carry picked items to the service station. They record details such as the container's current location via storageLocationRef. Because operative container types are configured per module, a type used during picking may not support SERVICE. Additionally, the picking process allows items to be picked without being placed into any load unit.
To ensure every picked item is represented in a service container, the system collects items from both cases (see following) into a single VIRTUAL container. This container is created along with all other service containers when fulfillmenttools updates the linked service jobs as part of closing the pick job. It's only created if at least one line item falls into either of the following categories:
Items picked into a load unit whose operative container type doesn't support
SERVICEItems that have a
globalLineItemIdand apickedquantity greater than0, but were not placed into any load unit during packing
If no such items exist because all items are already in physical containers, the virtual container is not created. When it is created, it has no operativeContainerTypeRef, and its sequenceNumber is always 0.
Last updated

