The TruePPM REST API is documented via OpenAPI 3.1, auto-generated by drf-spectacular.
http://localhost:8000/api/v1/
Content-Type: application/json
{"username": "...", "password": "..."}
Returns {"access": "<jwt>", "refresh": "<jwt>"}. Pass the access token on all subsequent requests:
Authorization: Bearer <access_token>
Refresh via POST /api/token/refresh/ with {"refresh": "<token>"}.
| Method | Path | Description |
|---|
| GET | /api/v1/calendars/ | List |
| POST | /api/v1/calendars/ | Create |
| GET | /api/v1/calendars/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/calendars/{id}/ | Update |
| DELETE | /api/v1/calendars/{id}/ | Soft-delete |
| Method | Path | Description |
|---|
| GET | /api/v1/projects/ | List (scoped to your memberships) |
| POST | /api/v1/projects/ | Create (caller becomes Owner) |
| GET | /api/v1/projects/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/projects/{id}/ | Update |
| DELETE | /api/v1/projects/{id}/ | Soft-delete |
| Method | Path | Description |
|---|
| GET | /api/v1/projects/{id}/members/ | List (Viewer+) |
| POST | /api/v1/projects/{id}/members/ | Add member (Owner only) |
| GET | /api/v1/projects/{id}/members/{mid}/ | Retrieve |
| PATCH | /api/v1/projects/{id}/members/{mid}/ | Change role (Owner only) |
| DELETE | /api/v1/projects/{id}/members/{mid}/ | Remove (Owner, or self) |
See RBAC for the permission matrix and role escalation rules.
| Method | Path | Description |
|---|
| GET | /api/v1/tasks/ | List (filter: ?project=, ?is_critical=true) |
| POST | /api/v1/tasks/ | Create |
| GET | /api/v1/tasks/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/tasks/{id}/ | Update |
| DELETE | /api/v1/tasks/{id}/ | Soft-delete (cascades to edges) |
CPM fields (early_start, early_finish, late_start, late_finish, total_float, is_critical) are read-only — set by the auto-scheduler.
| Method | Path | Description |
|---|
| GET | /api/v1/dependencies/ | List (filter: ?project=, ?dep_type=FS) |
| POST | /api/v1/dependencies/ | Create |
| GET | /api/v1/dependencies/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/dependencies/{id}/ | Update |
| DELETE | /api/v1/dependencies/{id}/ | Soft-delete |
Predecessor and successor must belong to the same project — cross-project edges return HTTP 400.
| Method | Path | Description |
|---|
| GET | /api/v1/resources/ | List |
| POST | /api/v1/resources/ | Create |
| GET | /api/v1/resources/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/resources/{id}/ | Update |
| DELETE | /api/v1/resources/{id}/ | Soft-delete |
| Method | Path | Description |
|---|
| GET | /api/v1/task-resources/ | List |
| POST | /api/v1/task-resources/ | Assign |
| GET | /api/v1/task-resources/{id}/ | Retrieve |
| PUT / PATCH | /api/v1/task-resources/{id}/ | Update |
| DELETE | /api/v1/task-resources/{id}/ | Remove |
| Method | Path | Description |
|---|
| GET | /api/v1/projects/{id}/sync/ | Pull delta changes |
See Offline Sync.
Default page size: 50. Response envelope:
{"count": 123, "next": "...?cursor=...", "previous": null, "results": [...]}
| Code | Meaning |
|---|
| 200 | OK |
| 201 | Created |
| 204 | No content (delete) |
| 400 | Validation error |
| 401 | Missing or invalid token |
| 403 | Insufficient role |
| 404 | Not found or soft-deleted |
| 409 | Conflict (e.g. duplicate membership) |