Required query parameter: projectId (integer).
Returns 400 Bad Request (projectId is required.) if omitted or 0.
Returns all activities within the specified project, sorted by name. Use the search parameter to filter by activity name. Waived activities are not included in the results.
Response 200
{
"items": [
{
"id": 20,
"activityName": "Site Survey",
"status": 3,
"actualEndDate": null,
"actualStartDate": "2026-05-01T00:00:00+00:00",
"plannedEndDate": "2026-06-01T00:00:00+00:00",
"plannedStartDate": "2026-05-01T00:00:00+00:00",
"enforceDates": true,
"phaseId": 5,
"projectId": 1,
"createdAt": "2025-02-01T00:00:00+00:00",
"updatedAt": "2026-04-15T00:00:00+00:00"
}
],
"page": 1,
"pageSize": 20,
"totalCount": 1,
"totalPages": 1
}
status is an activity status id. Status definitions (names/order) are organization-configurable, so there's no fixed enum. Look them up via the admin UI if you need the mapping.
phaseId is the id of the phase definition, not the id of this project's specific instance of that phase. You can't use it to look up a project-phase record directly.
Response 404: projectId doesn't exist.
Response 403: project exists but the caller cannot read it. Both Response 404 & 403 come back as the structured { "status": 0, "message": "..." } body.
id: integer.
Response 200: single activity object, same shape as above.
Response 404: activity doesn't exist.
Response 403: activity exists but the caller cannot read it. Both come back as the structured { "status": 0, "message": "..." } body (the existence check happens as part of the access check for this endpoint).
Requires a Read & write key.
Body (all optional)
{
"activityName": "Updated Name",
"status": 7,
"plannedStartDate": "2026-05-01T00:00:00Z",
"plannedEndDate": "2026-06-15T00:00:00Z"
}
actualStartDate and actualEndDate can also be set, but only when the activity's enforceDates is false.
Validation:
enforceDates: true, you cannot set actualStartDate or actualEndDate. Returns 400 Bad Request (ActualStartDate/ActualEndDate cannot be set while EnforceDates is true.).status, if provided, must be an existing activity status id, otherwise 400 Bad Request (Invalid status value.).The update can also fail with 409 Conflict if the resulting activity would be left in an invalid state, for example:
You cannot write to an activity if:
All four will return 403.
Response 204 on success.
Response 404: activity doesn't exist.
Response 403: see the conditions above (both 404/403 use the structured body, same as GET).
Response 409: see validation above.
Response 500: unexpected failure; the body is not guaranteed to say anything specific.
Requires a Read & write key. Behavior depends on the activity's applicability:
| Applicability | Behavior |
|---|---|
| Prerequisite | Rejected: 400 Bad Request (Cannot delete a Prerequisite activity.) |
| Mandatory | Soft "waived" instead of deleted. The activity is kept but marked waived and drops out of future list results. This also adds a visible comment on the activity, attributed to the key's user, with a fixed justification of "Waived via Developer API" |
| Applicable (or other) | Hard deleted, along with any form submissions and uploaded files attached to it |
The same write-access conditions as PATCH apply here too (Completed/Inactive project, Completed or already-Waived activity, locked phase all return 403), so deleting an already-waived activity returns 403 rather than silently succeeding.
Response 204 on success (including the waive case). Response 404: activity doesn't exist (this is checked before the access check on this endpoint, unlike GET/PATCH). Response 403: see above (structured body). Response 500: can happen if the activity's underlying activity standard has itself been deleted.