The privacy module serves data subject requests with the verify, export, anonymise, complete, and reject actions and an export download. All 11 endpoints sit under /api/v1/privacy. For business meaning see the Privacy module page.
Group facts¶
| Item | Value | Source |
|---|---|---|
| Base path | /api/v1/privacy |
src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/privacy/module.py:44 |
| Routers | 1 router objects in 1 files; listed in the section Endpoint summary | src/cluster_erp/modules/privacy/module.py:41 |
| Endpoints | 11, counted from the route decorators and add_api_route calls of the routers that register_routes mounts |
src/cluster_erp/modules/privacy/requests/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 | 11 of 11 routes declare require_permission |
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 |
|---|---|---|---|
requests |
router (/requests) |
11 | src/cluster_erp/modules/privacy/requests/routes.py:28 |
Data subject requests endpoints¶
Request records and their actions.
| Method | Path | Handler | Permission | Request | Query | Response | Status | Source |
|---|---|---|---|---|---|---|---|---|
GET |
/api/v1/privacy/requests/ |
list_subject_requests |
subject_request.read |
none | search, status, request_type, party_id, limit, offset |
dict |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:39 |
GET |
/api/v1/privacy/requests/{request_id} |
get_subject_request |
subject_request.read |
none | none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:70 |
POST |
/api/v1/privacy/requests/ |
create_subject_request |
subject_request.create |
SubjectRequestCreate |
none | SubjectRequestRead |
201 |
src/cluster_erp/modules/privacy/requests/routes.py:83 |
PUT |
/api/v1/privacy/requests/{request_id} |
update_subject_request |
subject_request.update |
SubjectRequestUpdate |
none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:96 |
DELETE |
/api/v1/privacy/requests/{request_id} |
delete_subject_request |
subject_request.delete |
none | none | none | 204 |
src/cluster_erp/modules/privacy/requests/routes.py:110 |
POST |
/api/v1/privacy/requests/{request_id}/actions/verify |
verify_identity |
subject_request.verify |
VerifyBody |
none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:125 |
POST |
/api/v1/privacy/requests/{request_id}/actions/export |
prepare_export |
subject_request.export |
none | none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:139 |
GET |
/api/v1/privacy/requests/{request_id}/export |
download_export |
subject_request.export |
none | none | Response |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:153 |
POST |
/api/v1/privacy/requests/{request_id}/actions/anonymise |
anonymise_subject |
subject_request.anonymise |
AnonymiseBody |
none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:175 |
POST |
/api/v1/privacy/requests/{request_id}/actions/complete |
complete_request |
subject_request.complete |
CompleteBody |
none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:190 |
POST |
/api/v1/privacy/requests/{request_id}/actions/reject |
reject_request |
subject_request.reject |
RejectBody |
none | SubjectRequestRead |
200 (default) | src/cluster_erp/modules/privacy/requests/routes.py:204 |
Error codes¶
The table lists the error codes that code under src/cluster_erp/modules/privacy/ 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 |
requests |
src/cluster_erp/modules/privacy/requests/services.py:176 |
PRIVACY_CONFIRMATION_MISMATCH |
400 |
requests |
src/cluster_erp/modules/privacy/requests/services.py:308 |
PRIVACY_EXPORT_MISSING |
404 |
requests |
src/cluster_erp/modules/privacy/requests/services.py:279 |
PRIVACY_INVALID_STATE |
409 |
requests |
src/cluster_erp/modules/privacy/requests/services.py:86 |
RESOURCE_NOT_FOUND |
404 |
requests |
src/cluster_erp/modules/privacy/requests/services.py:154 |
Events emitted¶
The table lists the contract classes that code under src/cluster_erp/modules/privacy/ 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 |
|---|---|---|
AnonymiseSubject |
1 | src/cluster_erp/modules/privacy/requests/services.py:345 |
CollectSubjectData |
1 | src/cluster_erp/modules/privacy/requests/services.py:223 |
Related pages¶
Verified against commit 92f8051 on 2026-11-13.