Skip to content

Update Project

This endpoint updates an existing project by ID. Only the fields you send are changed.

PUT /v1/projects/projects/:id

Include your API key in the x-api-key header. See Authentication.

projects:write
ParameterTypeRequiredDescription
idstringYesProject ID to update.

Send a JSON body. A request with no body returns 500. You cannot change clientId with this endpoint.

FieldTypeRequiredDescription
namestringNoNew project name. Also renames the default task.
descriptionstring | nullNoNew project description.
endCustomerIdstring | nullNoNew related end customer ID. Use null to clear the end customer. An unknown ID returns 500.
isArchivedbooleanNoNew archive state.
completedbooleanNoNew completion state.
autoAssignbooleanNoNew auto-assign state. See Behavior for the effect on tasks.
billingCategory"BILLABLE" | "NON_BILLABLE" | nullNoNew billing category. Use null to clear it. The value is also applied to all of the project’s tasks. Any other string returns 500.
customFieldsRecord<string, string>NoNew custom fields. The object replaces the existing custom fields. It is not merged.
{
"description": "Updated project description",
"completed": true,
"autoAssign": false,
"billingCategory": "NON_BILLABLE"
}
Terminal window
curl -X PUT "https://api.crewsum.com/v1/projects/projects/project-mno123pqr4567890" \
-H "x-api-key: $CREWSUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated project description",
"completed": true,
"autoAssign": false,
"billingCategory": "NON_BILLABLE"
}'

On success, the API returns HTTP 200 OK.

{
"message": "Successfully updated project: project-mno123pqr4567890"
}
  • Billing category: sending billingCategory, including null, sets the same value on every task in the project. While a project has a billing category, its tasks cannot set their own.
  • Auto-assign: setting autoAssign to true also turns on auto-assign for the default task. Changing autoAssign from true to false turns off auto-assign for every task in the project. Existing user assignments are not removed.
  • Name: changing name also renames the default task and sets its description to Default task for: <name>.
  • Archive: setting isArchived to true also archives the default task. Setting isArchived to false does not unarchive the default task unless you also send name in the same request.
  • If no project exists for the ID, the API still returns 200 and changes nothing. No webhook is sent in that case.
  • After the project is updated, Crewsum emits the projects.updated webhook event. A webhook delivery failure does not change the API response. Changes that cascade to tasks do not emit tasks.updated events.
StatusMeaning
400The project ID was missing from the route.
500Crewsum could not update the project. This includes an invalid billingCategory, an unknown endCustomerId, and a request with no JSON body.

Authentication and scope failures are described in Errors.