The intranet module serves content and spaces, audience segments, access grants, settings, comments, notifications, leave types, balances and requests, request types and requests, official deliveries, the directory, the caller's documents, kudos, quick links, alerts, events with media, and the feed. All 117 endpoints sit under /api/v1/intranet. For business meaning see the Intranet module page.
Group facts¶
| Item | Value | Source |
|---|---|---|
| Base path | /api/v1/intranet |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/intranet/module.py:172 |
| Routers | 21 router objects in 10 files; listed in the section Endpoint summary | src/cluster_erp/modules/intranet/module.py:133 |
| Endpoints | 117, counted from the route decorators and add_api_route calls of the routers that register_routes mounts |
src/cluster_erp/modules/intranet/content/routes.py, src/cluster_erp/modules/intranet/delivery/routes.py, src/cluster_erp/modules/intranet/directory/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 | 116 of 117 routes declare require_permission; the other routes show their guard in the tables |
src/cluster_erp/modules/auth/guards.py:205-240 |
| 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 |
|---|---|---|---|
content |
content_router (/content), space_router (/spaces), segment_router (/segments), acl_router (/acl), settings_router (/settings), comment_router (/comments) |
38 | src/cluster_erp/modules/intranet/content/routes.py:37, src/cluster_erp/modules/intranet/content/routes.py:36, src/cluster_erp/modules/intranet/content/routes.py:39, src/cluster_erp/modules/intranet/content/routes.py:38, src/cluster_erp/modules/intranet/content/routes.py:40, src/cluster_erp/modules/intranet/content/routes.py:41 |
notifications |
notification_router (/notifications) |
8 | src/cluster_erp/modules/intranet/notifications/routes.py:28 |
leave |
leave_type_router (/leave-types), leave_balance_router (/leave-balances), leave_request_router (/leave-requests) |
15 | src/cluster_erp/modules/intranet/leave/routes.py:28, src/cluster_erp/modules/intranet/leave/routes.py:29, src/cluster_erp/modules/intranet/leave/routes.py:32 |
requests |
request_type_router (/request-types), request_router (/requests) |
11 | src/cluster_erp/modules/intranet/requests/routes.py:27, src/cluster_erp/modules/intranet/requests/routes.py:28 |
delivery |
delivery_router (/deliveries) |
9 | src/cluster_erp/modules/intranet/delivery/routes.py:30 |
directory |
directory_router (/directory) |
4 | src/cluster_erp/modules/intranet/directory/routes.py:19 |
my_documents |
my_documents_router (/my-documents) |
1 | src/cluster_erp/modules/intranet/my_documents/routes.py:12 |
engagement |
kudos_router (/kudos), quicklink_router (/quick-links), alert_router (/alerts) |
15 | src/cluster_erp/modules/intranet/engagement/routes.py:27, src/cluster_erp/modules/intranet/engagement/routes.py:28, src/cluster_erp/modules/intranet/engagement/routes.py:29 |
events |
event_router (/events), media_router (/media) |
15 | src/cluster_erp/modules/intranet/events/routes.py:41, src/cluster_erp/modules/intranet/events/routes.py:42 |
feed |
feed_router (/feed) |
1 | src/cluster_erp/modules/intranet/feed/routes.py:23 |
Content, spaces, and access endpoints¶
Six routers: content (variants, views, analytics, compliance, acknowledgements, reactions, comments), spaces, segments with rebuild and members, ACL grants, the settings row, and comment moderation.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/content/ |
list_content |
intranet_content.read |
none | search, space_id, kind, status, mine, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:116 |
POST |
/api/v1/intranet/content/ |
create_content |
intranet_content.create |
sc.ContentCreate |
none | sc.ContentRead |
201 |
src/cluster_erp/modules/intranet/content/routes.py:171 |
GET |
/api/v1/intranet/content/pending-acks |
my_pending_acks |
intranet_content.read |
none | party_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:181 |
GET |
/api/v1/intranet/content/{content_id} |
get_content |
intranet_content.read |
none | none | sc.ContentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:205 |
PUT |
/api/v1/intranet/content/{content_id} |
update_content |
intranet_content.update |
sc.ContentUpdate |
none | sc.ContentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:230 |
POST |
/api/v1/intranet/content/{content_id}/actions/{action} |
run_content_action |
intranet_content.update |
dict[str, Any] \| None |
none | sc.ContentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:243 |
DELETE |
/api/v1/intranet/content/{content_id} |
deactivate_content |
intranet_content.delete |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:287 |
GET |
/api/v1/intranet/content/{content_id}/variants |
list_variants |
intranet_content.read |
none | none | list[sc.VariantRead] |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:307 |
PUT |
/api/v1/intranet/content/{content_id}/variants |
set_variant |
intranet_content.update |
sc.VariantWrite |
none | sc.VariantRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:317 |
POST |
/api/v1/intranet/content/{content_id}/view |
record_view |
intranet_content.read |
none | party_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:333 |
GET |
/api/v1/intranet/content/{content_id}/analytics |
content_analytics |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:349 |
GET |
/api/v1/intranet/content/{content_id}/compliance |
content_compliance |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:358 |
POST |
/api/v1/intranet/content/{content_id}/acknowledge |
acknowledge_content |
intranet_content.read |
sc.AckWrite \| None |
party_id |
sc.AckRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:370 |
GET |
/api/v1/intranet/content/{content_id}/acks |
list_acks |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:402 |
GET |
/api/v1/intranet/content/{content_id}/reactions |
reaction_counts |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:421 |
PUT |
/api/v1/intranet/content/{content_id}/reactions |
set_reaction |
intranet_content.read |
sc.ReactionWrite |
party_id |
sc.ReactionRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:430 |
DELETE |
/api/v1/intranet/content/{content_id}/reactions |
remove_reaction |
intranet_content.read |
none | party_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:448 |
GET |
/api/v1/intranet/content/{content_id}/comments |
list_comments |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:467 |
POST |
/api/v1/intranet/content/{content_id}/comments |
create_comment |
intranet_content.read |
sc.CommentCreate |
party_id |
sc.CommentRead |
201 |
src/cluster_erp/modules/intranet/content/routes.py:480 |
GET |
/api/v1/intranet/spaces/ |
list_spaces |
intranet_space.read |
none | search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:47 |
POST |
/api/v1/intranet/spaces/ |
create_space |
intranet_space.create |
sc.SpaceCreate |
none | sc.SpaceRead |
201 |
src/cluster_erp/modules/intranet/content/routes.py:68 |
GET |
/api/v1/intranet/spaces/{space_id} |
get_space |
intranet_space.read |
none | none | sc.SpaceRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:78 |
PUT |
/api/v1/intranet/spaces/{space_id} |
update_space |
intranet_space.update |
sc.SpaceUpdate |
none | sc.SpaceRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:90 |
DELETE |
/api/v1/intranet/spaces/{space_id} |
deactivate_space |
intranet_space.delete |
none | none | sc.SpaceRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:103 |
GET |
/api/v1/intranet/segments/ |
list_segments |
intranet_segment.read |
none | include_inactive, search |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:551 |
POST |
/api/v1/intranet/segments/ |
create_segment |
intranet_segment.create |
sc.SegmentCreate |
none | sc.SegmentRead |
201 |
src/cluster_erp/modules/intranet/content/routes.py:565 |
GET |
/api/v1/intranet/segments/{segment_id} |
get_segment |
intranet_segment.read |
none | none | sc.SegmentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:578 |
PUT |
/api/v1/intranet/segments/{segment_id} |
update_segment |
intranet_segment.update |
sc.SegmentUpdate |
none | sc.SegmentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:590 |
POST |
/api/v1/intranet/segments/{segment_id}/rebuild |
rebuild_segment |
intranet_segment.update |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:604 |
POST |
/api/v1/intranet/segments/rebuild-all |
rebuild_all_segments |
intranet_segment.update |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:619 |
GET |
/api/v1/intranet/segments/{segment_id}/members |
segment_members |
intranet_segment.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:636 |
DELETE |
/api/v1/intranet/segments/{segment_id} |
deactivate_segment |
intranet_segment.delete |
none | none | sc.SegmentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:646 |
GET |
/api/v1/intranet/acl/ |
list_grants |
intranet_content.read |
none | subject_kind, subject_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:515 |
POST |
/api/v1/intranet/acl/ |
set_grant |
intranet_content.update |
sc.AclGrantWrite |
none | sc.AclGrantRead |
201 |
src/cluster_erp/modules/intranet/content/routes.py:529 |
DELETE |
/api/v1/intranet/acl/{grant_id} |
remove_grant |
intranet_content.update |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:539 |
GET |
/api/v1/intranet/settings/ |
get_settings_row |
intranet_settings.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:659 |
PUT |
/api/v1/intranet/settings/ |
update_settings_row |
intranet_settings.update |
dict[str, Any] |
none | dict |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:676 |
POST |
/api/v1/intranet/comments/{comment_id}/moderate |
moderate_comment |
intranet_content.publish |
dict[str, Any] \| None |
none | sc.CommentRead |
200 (default) | src/cluster_erp/modules/intranet/content/routes.py:500 |
Notifications endpoints¶
Notifications, the caller's own list, unread count, mark read and seen, and dispatch rows.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/notifications/ |
list_notifications |
intranet_notification.read |
none | party_id, unread_only, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:31 |
GET |
/api/v1/intranet/notifications/mine |
list_my_notifications |
intranet_notification.read |
none | unread_only, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:67 |
GET |
/api/v1/intranet/notifications/unread-count |
unread_count |
intranet_notification.read |
none | party_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:92 |
POST |
/api/v1/intranet/notifications/read-all |
mark_all_read |
intranet_notification.update |
none | party_id |
dict |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:113 |
GET |
/api/v1/intranet/notifications/{notification_id}/dispatches |
list_dispatches |
intranet_notification.read |
none | none | list[sc.DispatchRead] |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:153 |
GET |
/api/v1/intranet/notifications/{notification_id} |
get_notification |
intranet_notification.read |
none | none | sc.NotificationRead |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:167 |
POST |
/api/v1/intranet/notifications/{notification_id}/read |
mark_read |
intranet_notification.update |
none | none | sc.NotificationRead |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:178 |
POST |
/api/v1/intranet/notifications/{notification_id}/seen |
mark_seen |
intranet_notification.update |
none | none | sc.NotificationRead |
200 (default) | src/cluster_erp/modules/intranet/notifications/routes.py:190 |
Leave endpoints¶
Three routers: leave types, leave balances, and leave requests with actions.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/leave-types/ |
list_leave_types |
intranet_leave_type.read |
none | include_inactive, search |
dict |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:40 |
POST |
/api/v1/intranet/leave-types/ |
create_leave_type |
intranet_leave_type.create |
sc.LeaveTypeCreate |
none | sc.LeaveTypeRead |
201 |
src/cluster_erp/modules/intranet/leave/routes.py:56 |
GET |
/api/v1/intranet/leave-types/{type_id} |
get_leave_type |
intranet_leave_type.read |
none | none | sc.LeaveTypeRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:66 |
PUT |
/api/v1/intranet/leave-types/{type_id} |
update_leave_type |
intranet_leave_type.update |
sc.LeaveTypeUpdate |
none | sc.LeaveTypeRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:78 |
DELETE |
/api/v1/intranet/leave-types/{type_id} |
deactivate_leave_type |
intranet_leave_type.delete |
none | none | sc.LeaveTypeRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:91 |
GET |
/api/v1/intranet/leave-balances/ |
list_balances |
intranet_leave_balance.read |
none | party_id, period_year |
dict |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:104 |
GET |
/api/v1/intranet/leave-balances/{balance_id} |
get_balance |
intranet_leave_balance.read |
none | none | sc.LeaveBalanceRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:126 |
POST |
/api/v1/intranet/leave-balances/ |
create_balance |
intranet_leave_balance.create |
sc.LeaveBalanceWrite |
none | sc.LeaveBalanceRead |
201 |
src/cluster_erp/modules/intranet/leave/routes.py:142 |
PUT |
/api/v1/intranet/leave-balances/{balance_id} |
update_balance |
intranet_leave_balance.update |
sc.LeaveBalanceUpdate |
none | sc.LeaveBalanceRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:154 |
GET |
/api/v1/intranet/leave-requests/ |
list_requests |
intranet_leave_request.read |
none | party_id, status, leave_type_id, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:170 |
POST |
/api/v1/intranet/leave-requests/ |
create_request |
intranet_leave_request.create |
sc.LeaveRequestCreate |
none | sc.LeaveRequestRead |
201 |
src/cluster_erp/modules/intranet/leave/routes.py:204 |
GET |
/api/v1/intranet/leave-requests/{request_id} |
get_request |
intranet_leave_request.read |
none | none | sc.LeaveRequestRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:225 |
PUT |
/api/v1/intranet/leave-requests/{request_id} |
update_request |
intranet_leave_request.update |
sc.LeaveRequestUpdate |
none | sc.LeaveRequestRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:241 |
POST |
/api/v1/intranet/leave-requests/{request_id}/actions/{action} |
run_request_action |
intranet_leave_request.update |
dict[str, Any] \| None |
none | sc.LeaveRequestRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:255 |
DELETE |
/api/v1/intranet/leave-requests/{request_id} |
deactivate_request |
intranet_leave_request.delete |
none | none | sc.LeaveRequestRead |
200 (default) | src/cluster_erp/modules/intranet/leave/routes.py:283 |
Requests endpoints¶
Two routers: request types and requests with actions.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/request-types/ |
list_request_types |
intranet_request_type.read |
none | include_inactive, search |
dict |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:34 |
POST |
/api/v1/intranet/request-types/ |
create_request_type |
intranet_request_type.create |
sc.RequestTypeCreate |
none | sc.RequestTypeRead |
201 |
src/cluster_erp/modules/intranet/requests/routes.py:50 |
GET |
/api/v1/intranet/request-types/{type_id} |
get_request_type |
intranet_request_type.read |
none | none | sc.RequestTypeRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:60 |
PUT |
/api/v1/intranet/request-types/{type_id} |
update_request_type |
intranet_request_type.update |
sc.RequestTypeUpdate |
none | sc.RequestTypeRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:72 |
DELETE |
/api/v1/intranet/request-types/{type_id} |
deactivate_request_type |
intranet_request_type.delete |
none | none | sc.RequestTypeRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:85 |
GET |
/api/v1/intranet/requests/ |
list_requests |
intranet_request.read |
none | party_id, status, request_type_id, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:98 |
POST |
/api/v1/intranet/requests/ |
create_request |
intranet_request.create |
sc.RequestCreate |
none | sc.RequestRead |
201 |
src/cluster_erp/modules/intranet/requests/routes.py:132 |
GET |
/api/v1/intranet/requests/{request_id} |
get_request |
intranet_request.read |
none | none | sc.RequestRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:152 |
PUT |
/api/v1/intranet/requests/{request_id} |
update_request |
intranet_request.update |
sc.RequestUpdate |
none | sc.RequestRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:168 |
POST |
/api/v1/intranet/requests/{request_id}/actions/{action} |
run_request_action |
intranet_request.update |
dict[str, Any] \| None |
none | sc.RequestRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:181 |
DELETE |
/api/v1/intranet/requests/{request_id} |
deactivate_request |
intranet_request.delete |
none | none | sc.RequestRead |
200 (default) | src/cluster_erp/modules/intranet/requests/routes.py:206 |
Official deliveries endpoints¶
Deliveries with a document download and the deliver, acknowledge, and refuse actions.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/deliveries/ |
list_deliveries |
intranet_official_delivery.read |
none | party_id, status, category, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:50 |
POST |
/api/v1/intranet/deliveries/ |
create_delivery |
intranet_official_delivery.create |
sc.DeliveryCreate |
none | sc.DeliveryRead |
201 |
src/cluster_erp/modules/intranet/delivery/routes.py:84 |
GET |
/api/v1/intranet/deliveries/{delivery_id} |
get_delivery |
intranet_official_delivery.read |
none | none | sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:101 |
GET |
/api/v1/intranet/deliveries/{delivery_id}/document |
download_delivery_document |
intranet_official_delivery.read |
none | none | Response |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:120 |
PUT |
/api/v1/intranet/deliveries/{delivery_id} |
update_delivery |
intranet_official_delivery.update |
sc.DeliveryUpdate |
none | sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:166 |
POST |
/api/v1/intranet/deliveries/{delivery_id}/actions/deliver |
deliver |
intranet_official_delivery.update |
dict[str, Any] \| None |
none | sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:182 |
POST |
/api/v1/intranet/deliveries/{delivery_id}/actions/acknowledge |
acknowledge_delivery |
intranet_official_delivery.read |
dict[str, Any] \| None |
party_id |
sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:197 |
POST |
/api/v1/intranet/deliveries/{delivery_id}/actions/refuse |
refuse |
intranet_official_delivery.update |
dict[str, Any] \| None |
none | sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:230 |
DELETE |
/api/v1/intranet/deliveries/{delivery_id} |
deactivate_delivery |
intranet_official_delivery.delete |
none | none | sc.DeliveryRead |
200 (default) | src/cluster_erp/modules/intranet/delivery/routes.py:242 |
Directory endpoints¶
The colleague directory, the organisation chart, one colleague, and direct reports.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/directory/ |
list_directory |
intranet_employee_projection.read |
none | search, dept_id, manager_party_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/directory/routes.py:22 |
GET |
/api/v1/intranet/directory/org-chart |
org_chart |
intranet_employee_projection.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/directory/routes.py:48 |
GET |
/api/v1/intranet/directory/{party_id} |
get_colleague |
intranet_employee_projection.read |
none | none | sc.EmployeeProjectionRead |
200 (default) | src/cluster_erp/modules/intranet/directory/routes.py:60 |
GET |
/api/v1/intranet/directory/{party_id}/reports |
direct_reports |
intranet_employee_projection.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/directory/routes.py:72 |
My documents endpoints¶
The caller's own documents. The handler resolves the user from the credential (src/cluster_erp/modules/intranet/my_documents/routes.py:25).
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/my-documents/ |
list_my_documents |
authenticated user (get_current_user) |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/my_documents/routes.py:15 |
Engagement endpoints¶
Three routers: kudos, quick links, and alerts with an active-alerts read.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/kudos/ |
list_kudos |
intranet_kudos.read |
none | to_party_id, search, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:35 |
POST |
/api/v1/intranet/kudos/ |
create_kudos |
intranet_kudos.create |
sc.KudosCreate |
none | sc.KudosRead |
201 |
src/cluster_erp/modules/intranet/engagement/routes.py:57 |
GET |
/api/v1/intranet/kudos/{kudos_id} |
get_kudos |
intranet_kudos.read |
none | none | sc.KudosRead |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:85 |
DELETE |
/api/v1/intranet/kudos/{kudos_id} |
deactivate_kudos |
intranet_kudos.delete |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:97 |
GET |
/api/v1/intranet/quick-links/ |
list_quicklinks |
intranet_quick_link.read |
none | include_inactive, search |
dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:110 |
POST |
/api/v1/intranet/quick-links/ |
create_quicklink |
intranet_quick_link.create |
sc.QuickLinkCreate |
none | sc.QuickLinkRead |
201 |
src/cluster_erp/modules/intranet/engagement/routes.py:126 |
GET |
/api/v1/intranet/quick-links/{link_id} |
get_quicklink |
intranet_quick_link.read |
none | none | sc.QuickLinkRead |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:136 |
PUT |
/api/v1/intranet/quick-links/{link_id} |
update_quicklink |
intranet_quick_link.update |
sc.QuickLinkUpdate |
none | sc.QuickLinkRead |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:148 |
DELETE |
/api/v1/intranet/quick-links/{link_id} |
deactivate_quicklink |
intranet_quick_link.delete |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:161 |
GET |
/api/v1/intranet/alerts/active |
active_alerts |
intranet_alert.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:174 |
GET |
/api/v1/intranet/alerts/ |
list_alerts |
intranet_alert.read |
none | include_inactive, search |
dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:186 |
POST |
/api/v1/intranet/alerts/ |
create_alert |
intranet_alert.create |
sc.AlertCreate |
none | sc.AlertRead |
201 |
src/cluster_erp/modules/intranet/engagement/routes.py:202 |
GET |
/api/v1/intranet/alerts/{alert_id} |
get_alert |
intranet_alert.read |
none | none | sc.AlertRead |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:214 |
PUT |
/api/v1/intranet/alerts/{alert_id} |
update_alert |
intranet_alert.update |
sc.AlertUpdate |
none | sc.AlertRead |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:226 |
DELETE |
/api/v1/intranet/alerts/{alert_id} |
deactivate_alert |
intranet_alert.delete |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/engagement/routes.py:239 |
Events and media endpoints¶
Two routers: events (actions, RSVP, RSVP list, invitations, changes, an iCalendar export) and media attached to an entity.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/events/ |
list_events |
intranet_event.read |
none | status, upcoming, from_dt, to_dt, space_id, search, mine, include_archived, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:57 |
POST |
/api/v1/intranet/events/ |
create_event |
intranet_event.create |
sc.EventCreate |
none | sc.EventRead |
201 |
src/cluster_erp/modules/intranet/events/routes.py:97 |
GET |
/api/v1/intranet/events/{event_id} |
get_event |
intranet_event.read |
none | none | sc.EventRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:116 |
PUT |
/api/v1/intranet/events/{event_id} |
update_event |
intranet_event.update |
sc.EventUpdate |
none | sc.EventRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:129 |
DELETE |
/api/v1/intranet/events/{event_id} |
archive_event |
intranet_event.update |
none | none | sc.EventRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:145 |
POST |
/api/v1/intranet/events/{event_id}/actions/{action} |
run_event_action |
intranet_event.update |
sc.EventActionIn \| None |
none | sc.EventRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:162 |
POST |
/api/v1/intranet/events/{event_id}/rsvp |
rsvp_event |
intranet_event.read |
sc.RsvpWrite |
none | sc.RsvpRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:207 |
GET |
/api/v1/intranet/events/{event_id}/rsvps |
list_event_rsvps |
intranet_event.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:229 |
GET |
/api/v1/intranet/events/{event_id}/invitations |
list_event_invitations |
intranet_event.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:263 |
GET |
/api/v1/intranet/events/{event_id}/changes |
list_event_changes |
intranet_event.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:281 |
GET |
/api/v1/intranet/events/{event_id}/ics |
event_ics |
intranet_event.read |
none | none | Response |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:295 |
GET |
/api/v1/intranet/media/{entity_type}/{entity_id} |
list_media |
intranet_content.read |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:325 |
POST |
/api/v1/intranet/media/{entity_type}/{entity_id} |
add_media |
intranet_content.update |
sc.MediaAdd |
none | sc.MediaRead |
201 |
src/cluster_erp/modules/intranet/events/routes.py:337 |
PUT |
/api/v1/intranet/media/{media_id} |
update_media |
intranet_content.update |
sc.MediaUpdate |
none | sc.MediaRead |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:352 |
DELETE |
/api/v1/intranet/media/{media_id} |
remove_media |
intranet_content.update |
none | none | dict |
200 (default) | src/cluster_erp/modules/intranet/events/routes.py:363 |
Feed endpoints¶
The caller's feed.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/intranet/feed/ |
get_feed |
intranet_content.read |
none | types, kind, space_id, mine, before, limit |
dict |
200 (default) | src/cluster_erp/modules/intranet/feed/routes.py:26 |
Error codes¶
The table lists the error codes that code under src/cluster_erp/modules/intranet/ 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 |
|---|---|---|---|
AUTH_PERMISSION_DENIED |
403 |
access, content, delivery, events |
src/cluster_erp/modules/intranet/access.py:75 |
INTRANET_ERROR |
400 |
content, leave, requests |
src/cluster_erp/modules/intranet/content/services.py:1098 |
INTRANET_EVENT_ENDS_BEFORE_START |
422 |
events |
src/cluster_erp/modules/intranet/events/services.py:377 |
INTRANET_EVENT_FULL |
422 |
events |
src/cluster_erp/modules/intranet/events/lifecycle.py:255 |
INTRANET_EVENT_INVALID_STATUS |
422 |
events |
src/cluster_erp/modules/intranet/events/lifecycle.py:108 |
INTRANET_EVENT_NOT_EDITABLE |
422 |
events |
src/cluster_erp/modules/intranet/events/lifecycle.py:139 |
INTRANET_EVENT_REASON_REQUIRED |
422 |
events |
src/cluster_erp/modules/intranet/events/lifecycle.py:306 |
INTRANET_EVENT_RSVP_CLOSED |
422 |
events |
src/cluster_erp/modules/intranet/events/services.py:609 |
INTRANET_EVENT_UNCANCEL_EXPIRED |
422 |
events |
src/cluster_erp/modules/intranet/events/lifecycle.py:156 |
INTRANET_INVALID_STATUS |
400 |
content, delivery, leave, requests |
src/cluster_erp/modules/intranet/content/services.py:821 |
INTRANET_LEAVE_DOCUMENT_REQUIRED |
409 |
leave |
src/cluster_erp/modules/intranet/leave/services.py:515 |
INTRANET_LEAVE_GENDER_RESTRICTED |
409 |
leave |
src/cluster_erp/modules/intranet/leave/services.py:459 |
INTRANET_LEAVE_INSUFFICIENT_BALANCE |
409 |
leave |
src/cluster_erp/modules/intranet/leave/services.py:539 |
INTRANET_LEAVE_NOTICE_TOO_SHORT |
409 |
leave |
src/cluster_erp/modules/intranet/leave/services.py:490 |
INTRANET_LEAVE_OVERLAP |
409 |
leave |
src/cluster_erp/modules/intranet/leave/services.py:432 |
INTRANET_MEDIA_ENTITY |
422 |
events |
src/cluster_erp/modules/intranet/events/routes.py:317 |
INTRANET_NO_PARTY |
400 |
content, engagement, events |
src/cluster_erp/modules/intranet/content/routes.py:384 |
INTRANET_PARTY_NOT_EMPLOYEE |
422 |
access |
src/cluster_erp/modules/intranet/access.py:139 |
RESOURCE_CONFLICT |
409 |
content, leave, requests |
src/cluster_erp/modules/intranet/content/services.py:310 |
RESOURCE_NOT_FOUND |
404 |
content, delivery, directory, engagement, events, leave, notifications, requests |
src/cluster_erp/modules/intranet/content/routes.py:86 |
Events emitted¶
The table lists the contract classes that code under src/cluster_erp/modules/intranet/ 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 |
|---|---|---|
IntranetEventCancelled |
1 | src/cluster_erp/modules/intranet/events/services.py:497 |
IntranetEventPublished |
1 | src/cluster_erp/modules/intranet/events/services.py:590 |
IntranetEventUpdated |
1 | src/cluster_erp/modules/intranet/events/services.py:431 |
IntranetPostPublished |
1 | src/cluster_erp/modules/intranet/content/routes.py:273 |
ResolveEntityEmails |
2 | src/cluster_erp/modules/intranet/directory/services.py:91 |
SendTransactionalEmail |
1 | src/cluster_erp/modules/intranet/notify.py:51 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.