> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://developer.projectmanager.com/api-reference/task/update-task/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.projectmanager.com/_mcp/server. # Update Task PUT https://api.projectmanager.com/api/data/tasks/{taskId} Content-Type: application/json Update an existing Task and replace the values of fields specified. A Task is an individual element of work that must be performed to complete a Project. A Task can have one or more Resources assigned to it. Tasks can be linked to other Tasks to indicate whether they have a dependency or a connection. Multiple users can be working on data at the same time. When you call an API to update an object, this call is converted into a Changeset that is then applied sequentially. You can use RetrieveChangeset to see the status of an individual Changeset. Known Issues: This API returns an error if your Update call includes too many changes in a single API call. Please restrict usage to one change per API request. This API will be deprecated and replaced with an improved API call in a future release. Reference: https://developer.projectmanager.com/api-reference/task/update-task ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token. ## Request ### Path parameters - `taskId` (string, required) — The unique identifier of the Task to update ### Headers - `x-integration-name` (string, optional) — The name of the calling system passed along as a header parameter ### Body (application/json) This endpoint expects a TaskUpdateDto. - `name` (string, optional, nullable) — The common name of this Task. - `description` (string, optional, nullable) — A description of the work to be performed in this Task. - `percentComplete` (integer, optional, nullable) — The numerical percentage, from 0-100, representing the percentage completion for this Task. Any numbers below zero or above 100 will be clamped to the minimum or maximum value. This value can be edited manually in the Gantt chart view of the application, or can be selected on the Task Detail page within the Kanban board. - `statusId` (string, optional, nullable) — The TaskStatus assigned to this Task. - `priorityId` (integer, optional, nullable) — The unique identifier of the TaskPriority - `plannedStartDate` (string, optional, nullable) — The date when work on this Task is planned to begin. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time. - `plannedFinishDate` (string, optional, nullable) — The date when work on this Task is expected to complete. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time. - `plannedDuration` (integer, optional, nullable) — The planned duration (in minutes) for this Task. Cannot be negative. - `plannedEffort` (integer, optional, nullable) — The planned effort (in minutes) for this Task. Cannot be negative. - `plannedCost` (double, optional, nullable) — The planned cost for this Task. Cannot be negative. - `actualStartDate` (string, optional, nullable) — If set, this is the actual date when work began on the Task. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time. - `actualFinishDate` (string, optional, nullable) — If set, this is the actual date when work was completed on the Task. This value contains only the date in year-month-day format. For display, this date will always be shown as this same year-month-day regardless of time zone. For reporting purposes, this date is calculated against the official time zone of the Workspace. For example: A Task has a planned completion date of July 5, 2023 in a Workspace that has a time zone of US Pacific Time (GMT-7 or GMT-8, depending on daylight savings time). This project is considered overdue on 12:01 AM July 6th 2023 in US Pacific time. - `actualDuration` (integer, optional, nullable) — The actual duration (in minutes) for this Task. Cannot be negative. - `actualCost` (double, optional, nullable) — If set, this represents the actual tracked cost for this Task. - `theme` (string, optional, nullable) — Color theme definition for this task. eg. Blue, Brown, DarkBlue, DarkGrey, Gold, Green, Grey, LightBrown, LightGreen, LightGrey, LightPurple, LightYellow, Magenta, Mauve, Navy, Orange, Purple, Red. - `isLocked` (boolean, optional, nullable) — Unlocked tasks can be adjusted by changes to their dependencies, resource leveling, or other factors. All tasks are unlocked by default. If a task is set to `IsLocked` = `true`, the dates and assigned resources are locked for this task and will not be automatically changed by any process. - `isMilestone` (boolean, optional, nullable) — True if this task is a milestone. Milestones represent a specific point in time for the project. When a milestone is locked, it represents a fixed time within the project that can be used to relate to other tasks. - `breakRecurrency` (boolean, optional) — Set this to true to break this Task out of its recurring series as part of this update. The Task is detached from its series, clearing its parent/child relationship and its recurrence settings. Any other changes in the same update are then applied to this Task alone rather than being propagated across the rest of the series. This has no effect if the Task is not part of a recurring series. A Task can only be made recurring through the TaskRecurrency endpoints. - `moveToProject` (MoveTaskToProjectDto, optional, nullable) — Object contains data to move task to another project ## Response ### 200 Success - `error` (AstroError, optional, nullable) — If the API call failed, this will contain information about the error that occurred. - `success` (boolean, optional) — True if the API call succeeded; false otherwise. - `hasError` (boolean, optional) — True if the API call failed. - `statusCode` (enum, optional) — The HTTP code of the response. - Allowed values: `Continue`, `SwitchingProtocols`, `Processing`, `EarlyHints`, `OK`, `Created`, `Accepted`, `NonAuthoritativeInformation`, `NoContent`, `ResetContent`, `PartialContent`, `MultiStatus`, `AlreadyReported`, `IMUsed`, `MultipleChoices`, `MovedPermanently`, `Found`, `SeeOther`, `NotModified`, `UseProxy`, `Unused`, `TemporaryRedirect`, `PermanentRedirect`, `BadRequest`, `Unauthorized`, `PaymentRequired`, `Forbidden`, `NotFound`, `MethodNotAllowed`, `NotAcceptable`, `ProxyAuthenticationRequired`, `RequestTimeout`, `Conflict`, `Gone`, `LengthRequired`, `PreconditionFailed`, `RequestEntityTooLarge`, `RequestUriTooLong`, `UnsupportedMediaType`, `RequestedRangeNotSatisfiable`, `ExpectationFailed`, `MisdirectedRequest`, `UnprocessableEntity`, `Locked`, `FailedDependency`, `UpgradeRequired`, `PreconditionRequired`, `TooManyRequests`, `RequestHeaderFieldsTooLarge`, `UnavailableForLegalReasons`, `InternalServerError`, `NotImplemented`, `BadGateway`, `ServiceUnavailable`, `GatewayTimeout`, `HttpVersionNotSupported`, `VariantAlsoNegotiates`, `InsufficientStorage`, `LoopDetected`, `NotExtended`, `NetworkAuthenticationRequired` - `data` (ChangeSetStatusDto, optional) — Returns the id of a specific ChangeSet ## Types ### MoveTaskToProjectDto Move task to project data transfer object. Contains information about target project to move, necessary options and users to add access for if needed. - `projectId` (string, optional) — Target project id to move - `keepTimeEntries` (boolean, optional) — Move time entries associated with the task. If false, time entries will be copied to the new project but remain in the original project as well. If true, time entries will be moved to the new project and removed from the original project. - `addAccessUserIds` (list of string, optional) — List of user IDs to add access for in the new project. ### AstroError Information about an error that occurred within the ProjectManager API. - `technicalError` (string, optional, nullable) — A technical description of the error that occurred. Not suitable for display to end users. - `additionalErrors` (list of string, optional, nullable) — If additional errors beyond the main error in `Message` occurred, they will be listed here as individual messages. - `validationErrors` (map from string to list of string, optional, nullable) — This contains a dictionary of validation errors. The key is the name of the field - `message` (string, optional, nullable) — A description of the error that occurred. If your application has a user interface, show this message to explain what went wrong. ### ChangeSetStatusDto Returns the id of a specific ChangeSet - `changeSetId` (string, optional) — The unique identifier of this Changeset - `id` (string, optional) — The unique identifier of the entity affected by this Changeset. For example, if this Changeset was created for a Task, this value will be the unique identifier for the Task. ## Examples **Request** ```json {} ``` **Response** ```json { "error": { "technicalError": "string", "additionalErrors": [ "string" ], "validationErrors": {}, "message": "string" }, "success": true, "hasError": true, "statusCode": "Continue", "data": { "changeSetId": "string", "id": "string" } } ``` **SDK Code** ```python import requests url = "https://api.projectmanager.com/api/data/tasks/taskId" payload = {} headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.put(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.projectmanager.com/api/data/tasks/taskId'; const options = { method: 'PUT', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '{}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.projectmanager.com/api/data/tasks/taskId" payload := strings.NewReader("{}") req, _ := http.NewRequest("PUT", url, payload) req.Header.Add("Authorization", "Bearer ") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.projectmanager.com/api/data/tasks/taskId") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Put.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "{}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.put("https://api.projectmanager.com/api/data/tasks/taskId") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{}") .asString(); ``` ```php request('PUT', 'https://api.projectmanager.com/api/data/tasks/taskId', [ 'body' => '{}', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.projectmanager.com/api/data/tasks/taskId"); var request = new RestRequest(Method.PUT); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.projectmanager.com/api/data/tasks/taskId")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "PUT" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```