This page lists the 16 endpoints of the purchase_contracts sub-module of the procurement module, under /api/v1/procurement. Scope: Contract records, completeness, activate, close, expire, cancel, reopen, and contract items. The module entry page is Procurement API.
Group facts¶
| Item | Value | Source |
|---|---|---|
| Base path | /api/v1/procurement |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/procurement/module.py:70 |
| Routers | 1 router objects in 1 files; listed in the section Endpoints | src/cluster_erp/modules/procurement/module.py:35 |
| Endpoints | 16, counted from the route decorators and add_api_route calls of the routers that register_routes mounts |
src/cluster_erp/modules/procurement/purchase_contracts/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 | 16 of 16 routes declare require_permission |
src/cluster_erp/modules/auth/guards.py:205-240 |
| App entitlement gate | require_app("procurement") on every mounted router |
src/cluster_erp/modules/procurement/module.py:82 |
| Error format | JSON body {"error": {...}}; see Errors |
src/cluster_erp/server/error_handler.py:33-46 |
Endpoints¶
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/procurement/purchase-contracts/ |
list_contracts |
purchase_contract.read |
none | search, status, contract_type, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:55 |
POST |
/api/v1/procurement/purchase-contracts/ |
create_contract |
purchase_contract.create |
PurchaseContractCreate |
none | PurchaseContractRead |
201 |
src/cluster_erp/modules/procurement/purchase_contracts/routes.py:91 |
GET |
/api/v1/procurement/purchase-contracts/{contract_id} |
get_contract |
purchase_contract.read |
none | none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:102 |
PUT |
/api/v1/procurement/purchase-contracts/{contract_id} |
update_contract |
purchase_contract.update |
PurchaseContractUpdate |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:115 |
DELETE |
/api/v1/procurement/purchase-contracts/{contract_id} |
delete_contract |
purchase_contract.delete |
none | none | none | 204 |
src/cluster_erp/modules/procurement/purchase_contracts/routes.py:129 |
POST |
/api/v1/procurement/purchase-contracts/bulk-delete |
bulk_delete |
purchase_contract.delete |
BulkDeleteRequest |
none | BulkDeleteResponse |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:140 |
GET |
/api/v1/procurement/purchase-contracts/{contract_id}/completeness |
get_completeness |
purchase_contract.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:155 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/activate |
activate |
purchase_contract.activate |
PconTransition |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:170 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/close |
close |
purchase_contract.update |
PconTransition |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:184 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/expire |
expire |
purchase_contract.update |
PconTransition |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:196 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/cancel |
cancel |
purchase_contract.cancel |
PconReasonTransition |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:210 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/reopen |
reopen |
purchase_contract.update |
PconTransition |
none | PurchaseContractRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:227 |
GET |
/api/v1/procurement/purchase-contracts/{contract_id}/items |
list_items |
purchase_contract.read |
none | search |
list[PurchaseContractItemRead] |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:242 |
POST |
/api/v1/procurement/purchase-contracts/{contract_id}/items |
add_item |
purchase_contract.update |
PurchaseContractItemCreate |
none | PurchaseContractItemRead |
201 |
src/cluster_erp/modules/procurement/purchase_contracts/routes.py:257 |
PUT |
/api/v1/procurement/purchase-contract-items/{item_id} |
update_item |
purchase_contract.update |
PurchaseContractItemUpdate |
none | PurchaseContractItemRead |
200 (default) | src/cluster_erp/modules/procurement/purchase_contracts/routes.py:273 |
DELETE |
/api/v1/procurement/purchase-contract-items/{item_id} |
delete_item |
purchase_contract.update |
none | none | none | 204 |
src/cluster_erp/modules/procurement/purchase_contracts/routes.py:290 |
Error codes¶
The table lists the error codes that code under src/cluster_erp/modules/procurement/purchase_contracts/ 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 |
|---|---|---|---|
CONCURRENCY_VERSION_CONFLICT |
409 |
services |
src/cluster_erp/modules/procurement/purchase_contracts/services.py:175 |
PCON_INCOMPLETE |
409 |
services |
src/cluster_erp/modules/procurement/purchase_contracts/services.py:246 |
PCON_INVALID_STATUS |
409 |
services |
src/cluster_erp/modules/procurement/purchase_contracts/services.py:203 |
RESOURCE_NOT_FOUND |
404 |
routes, services |
src/cluster_erp/modules/procurement/purchase_contracts/routes.py:111 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.