The bom module serves bills of materials, BOM versions with their lifecycle and read models (tree, explosion, where-used, purchase coverage), BOM items, and BOM templates. All 39 endpoints sit under /api/v1/bom. For business meaning see the BOM module page.
Group facts¶
| Item | Value | Source |
|---|---|---|
| Base path | /api/v1/bom |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/bom/module.py:53 |
| Routers | 4 router objects in 4 files; listed in the section Endpoint summary | src/cluster_erp/modules/bom/module.py:36 |
| Endpoints | 39, counted from the route decorators and add_api_route calls of the routers that register_routes mounts |
src/cluster_erp/modules/bom/bom_items/routes.py, src/cluster_erp/modules/bom/bom_templates/routes.py, src/cluster_erp/modules/bom/bom_versions/routes.py ... |
| Authentication | Bearer header or session cookie, resolved by get_current_user; see Authentication and headers |
src/cluster_erp/modules/auth/guards.py:85-167 |
| Permission guard | 39 of 39 routes declare require_permission |
src/cluster_erp/modules/auth/guards.py:205-240 |
| App entitlement gate | require_app("bom") on every mounted router |
src/cluster_erp/modules/bom/module.py:59 |
| Error format | JSON body {"error": {...}}; see Errors |
src/cluster_erp/server/error_handler.py:33-46 |
Endpoint summary¶
One row per sub-module folder. The router prefix is added to the base path.
| Sub-module | Routers | Endpoints | Router source |
|---|---|---|---|
boms |
router (/boms) |
6 | src/cluster_erp/modules/bom/boms/routes.py:31 |
bom_versions |
router (/bom-versions) |
15 | src/cluster_erp/modules/bom/bom_versions/routes.py:26 |
bom_items |
router (/bom-items) |
8 | src/cluster_erp/modules/bom/bom_items/routes.py:31 |
bom_templates |
router (/bom-templates) |
10 | src/cluster_erp/modules/bom/bom_templates/routes.py:29 |
BOM headers endpoints¶
BOM header records.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/bom/boms/ |
list_boms |
bom.read |
none | search, status, product_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/bom/boms/routes.py:43 |
GET |
/api/v1/bom/boms/{bom_id} |
get_bom |
bom.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/bom/boms/routes.py:96 |
POST |
/api/v1/bom/boms/ |
create_bom |
bom.create |
BomCreate |
none | BomRead |
201 |
src/cluster_erp/modules/bom/boms/routes.py:128 |
PUT |
/api/v1/bom/boms/{bom_id} |
update_bom |
bom.create |
BomUpdate |
none | BomRead |
200 (default) | src/cluster_erp/modules/bom/boms/routes.py:140 |
DELETE |
/api/v1/bom/boms/{bom_id} |
delete_bom |
bom.create |
none | none | none | 204 |
src/cluster_erp/modules/bom/boms/routes.py:155 |
POST |
/api/v1/bom/boms/bulk-delete |
bulk_delete_boms |
bom.create |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/bom/boms/routes.py:167 |
BOM versions endpoints¶
Version records, activation, clone, supersede, copy from a template, recalculation, and read models: tree, purchase coverage, explosion, where-used, and the active version of a product.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/bom/bom-versions/ |
list_bom_versions |
bom.read |
none | bom_id, status, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:29 |
GET |
/api/v1/bom/bom-versions/active-for-product/{product_id} |
active_bom_version_for_product |
bom.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:72 |
GET |
/api/v1/bom/bom-versions/{version_id} |
get_bom_version |
bom.read |
none | none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:92 |
POST |
/api/v1/bom/bom-versions/ |
create_bom_version |
bom.create |
BomVersionCreate |
none | BomVersionRead |
201 |
src/cluster_erp/modules/bom/bom_versions/routes.py:106 |
PUT |
/api/v1/bom/bom-versions/{version_id} |
update_bom_version |
bom.create |
BomVersionUpdate |
none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:118 |
DELETE |
/api/v1/bom/bom-versions/{version_id} |
delete_bom_version |
bom.create |
none | none | none | 204 |
src/cluster_erp/modules/bom/bom_versions/routes.py:133 |
POST |
/api/v1/bom/bom-versions/{version_id}/activate |
activate_bom_version |
bom.activate |
none | none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:145 |
POST |
/api/v1/bom/bom-versions/{version_id}/clone |
clone_bom_version |
bom.create |
none | none | BomVersionRead |
201 |
src/cluster_erp/modules/bom/bom_versions/routes.py:157 |
POST |
/api/v1/bom/bom-versions/{version_id}/supersede |
supersede_bom_version |
bom.activate |
BomVersionSupersedeRequest |
none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:170 |
POST |
/api/v1/bom/bom-versions/{version_id}/copy-from-template |
copy_from_template |
bom.create |
BomVersionCopyFromTemplateRequest |
none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:187 |
POST |
/api/v1/bom/bom-versions/{version_id}/recalculate |
recalculate_bom_version |
bom.create |
none | none | BomVersionRead |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:204 |
GET |
/api/v1/bom/bom-versions/{version_id}/tree |
bom_version_tree |
bom.read |
none | none | BomTreeResponse |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:216 |
GET |
/api/v1/bom/bom-versions/{version_id}/purchase-coverage |
purchase_coverage_bom_version |
bom.read |
none | lot_qty, need_date |
dict |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:227 |
GET |
/api/v1/bom/bom-versions/{version_id}/explosion |
explosion_bom_version |
bom.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:244 |
GET |
/api/v1/bom/bom-versions/{version_id}/where-used |
where_used_bom_version |
bom.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/bom/bom_versions/routes.py:292 |
BOM items endpoints¶
Item records, item move within the tree, and where-used for a part.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/bom/bom-items/ |
list_bom_items |
bom.read |
none | bom_version_id, parent_item_id, part_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:54 |
GET |
/api/v1/bom/bom-items/where-used/{part_id} |
where_used_part |
bom.read |
none | limit |
WhereUsedResponse |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:121 |
GET |
/api/v1/bom/bom-items/{item_id} |
get_bom_item |
bom.read |
none | none | BomItemRead |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:216 |
POST |
/api/v1/bom/bom-items/ |
create_bom_item |
bom.create |
BomItemCreate |
none | BomItemRead |
201 |
src/cluster_erp/modules/bom/bom_items/routes.py:230 |
PUT |
/api/v1/bom/bom-items/{item_id} |
update_bom_item |
bom.create |
BomItemUpdate |
none | BomItemRead |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:242 |
POST |
/api/v1/bom/bom-items/{item_id}/move |
move_bom_item |
bom.create |
BomItemMove |
none | BomItemRead |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:257 |
DELETE |
/api/v1/bom/bom-items/{item_id} |
delete_bom_item |
bom.create |
none | none | none | 204 |
src/cluster_erp/modules/bom/bom_items/routes.py:278 |
POST |
/api/v1/bom/bom-items/bulk-delete |
bulk_delete_bom_items |
bom.create |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/bom/bom_items/routes.py:290 |
BOM templates endpoints¶
Template records and template items.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/bom/bom-templates/ |
list_bom_templates |
bom.read |
none | search, family, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:32 |
GET |
/api/v1/bom/bom-templates/items/ |
list_bom_template_items |
bom.read |
none | template_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:62 |
POST |
/api/v1/bom/bom-templates/items/ |
create_bom_template_item |
bom.create |
BomTemplateItemCreate |
none | BomTemplateItemRead |
201 |
src/cluster_erp/modules/bom/bom_templates/routes.py:104 |
PUT |
/api/v1/bom/bom-templates/items/{item_id} |
update_bom_template_item |
bom.create |
BomTemplateItemUpdate |
none | BomTemplateItemRead |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:116 |
DELETE |
/api/v1/bom/bom-templates/items/{item_id} |
delete_bom_template_item |
bom.create |
none | none | none | 204 |
src/cluster_erp/modules/bom/bom_templates/routes.py:131 |
GET |
/api/v1/bom/bom-templates/{template_id} |
get_bom_template |
bom.read |
none | none | BomTemplateRead |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:143 |
POST |
/api/v1/bom/bom-templates/ |
create_bom_template |
bom.create |
BomTemplateCreate |
none | BomTemplateRead |
201 |
src/cluster_erp/modules/bom/bom_templates/routes.py:157 |
PUT |
/api/v1/bom/bom-templates/{template_id} |
update_bom_template |
bom.create |
BomTemplateUpdate |
none | BomTemplateRead |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:169 |
DELETE |
/api/v1/bom/bom-templates/{template_id} |
delete_bom_template |
bom.create |
none | none | none | 204 |
src/cluster_erp/modules/bom/bom_templates/routes.py:184 |
POST |
/api/v1/bom/bom-templates/bulk-delete |
bulk_delete_bom_templates |
bom.create |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/bom/bom_templates/routes.py:196 |
Error codes¶
The table lists the error codes that code under src/cluster_erp/modules/bom/ raises, found by a syntax-tree scan for AppError(...), the factories in src/cluster_erp/core/errors.py (not_found, conflict, protected, permission_denied, privilege_escalation, check_version), and HTTPException(...). A status of 400 is the AppError default (src/cluster_erp/core/errors.py:23). Guard errors (401, 403), the entitlement codes, and validation errors (422) apply to every route and are listed on Errors.
| Code | HTTP status | Raised in | First site |
|---|---|---|---|
BOM_ACTIVE_VERSION_EXISTS |
400 |
bom_versions |
src/cluster_erp/modules/bom/bom_versions/services.py:439 |
BOM_ACTIVE_VERSION_LOCKED |
400 |
bom_items, bom_versions |
src/cluster_erp/modules/bom/bom_items/services.py:415 |
BOM_INVALID_QTY |
400 |
bom_items, bom_templates |
src/cluster_erp/modules/bom/bom_items/services.py:142 |
BOM_INVALID_STATUS |
400 |
bom_versions, boms |
src/cluster_erp/modules/bom/bom_versions/services.py:314 |
BOM_MAX_DEPTH_EXCEEDED |
400 |
bom_items |
src/cluster_erp/modules/bom/bom_items/services.py:174 |
BOM_TEMPLATE_EMPTY |
400 |
bom_versions |
src/cluster_erp/modules/bom/bom_versions/services.py:569 |
BOM_VERSION_EMPTY |
422 |
bom_versions |
src/cluster_erp/modules/bom/bom_versions/services.py:664 |
CONCURRENCY_VERSION_CONFLICT |
409 |
bom_items, bom_templates, bom_versions, boms |
src/cluster_erp/modules/bom/bom_items/services.py:251 |
RESOURCE_NOT_FOUND |
404 |
bom_items, bom_templates, bom_versions, boms |
src/cluster_erp/modules/bom/bom_items/routes.py:226 |
VALIDATION_ERROR |
422 |
bom_items |
src/cluster_erp/modules/bom/bom_items/services.py:118 |
Events emitted¶
The table lists the contract classes that code under src/cluster_erp/modules/bom/ passes directly to EventBus.emit, found by a syntax-tree scan. Events built in a variable first are not counted. The contracts are described in Contracts reference.
| Contract | Sites | First site |
|---|---|---|
BomActivated |
2 | src/cluster_erp/modules/bom/bom_versions/services.py:455 |
BomDraftCreated |
3 | src/cluster_erp/modules/bom/bom_versions/services.py:256 |
BomItemChanged |
3 | src/cluster_erp/modules/bom/bom_items/services.py:226 |
BomSuperseded |
1 | src/cluster_erp/modules/bom/bom_versions/services.py:515 |
BomVersionActivated |
2 | src/cluster_erp/modules/bom/bom_versions/services.py:464 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.