> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://developer.projectmanager.com/api-reference/project/update-project/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.projectmanager.com/_mcp/server. # Update Project PUT https://api.projectmanager.com/api/data/projects/{projectId} Content-Type: application/json Update an existing Project and replace the values of fields specified. A Project is a collection of Tasks that contributes towards a goal. Within a Project, Tasks represent individual items of work that team members must complete. The sum total of Tasks within a Project represents the work to be completed for that Project. Reference: https://developer.projectmanager.com/api-reference/project/update-project ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token. ## Request ### Path parameters - `projectId` (string, required) — The unique identifier of the Project 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 ProjectUpdateDto. - `name` (string, optional, nullable) — The name of the Project. - `shortName` (string, optional, nullable) — The short name of the Project. - `description` (string, optional, nullable) — An optional description of the Project - `targetDate` (string, optional, nullable) — The target planned completion date for this Project, or null if one has not been selected. This value can be updated in the Project Settings page or the Portfolio Project page within the application. - `folderId` (string, optional, nullable) — To move this Project into a ProjectFolder, set this to the unique identifier of the ProjectFolder. - `customerId` (string, optional, nullable) — To assign this Project to a ProjectCustomer, set this to the unique identifier of the ProjectCustomer. If set to an empty guid the Project will be unassigned from the current ProjectCustomer. - `managerId` (string, optional, nullable) — To assign this Project to a ProjectManager, set this to the unique identifier of the ProjectManager. - `chargeCodeId` (string, optional, nullable) — To set the ChargeCode for this Project, set this to the unique identifier of the ChargeCode to use for this Project. - `statusId` (string, optional, nullable) — To change the ProjectStatus of this Project, set this to the unique identifier of the ProjectStatus. - `priorityId` (string, optional, nullable) — To change the ProjectPriority of this Project, set this to the unique identifier of the ProjectPriority. - `hourlyRate` (double, optional, nullable) — To change the hourly rate of this Project, set this to the new amount. - `budget` (double, optional, nullable) — To change the budget of this Project, set this to the new amount. - `statusUpdate` (string, optional, nullable) — To update the Project's status text, set this to the new status text. - `favorite` (boolean, optional, nullable) — Mark this project as favorite for the logged in user. - `template` (boolean, optional, nullable) — True if this Project is a template that will be reused as a framework for future Projects. You can save a Project as a template and reuse it in the future for creating additional Projects. If this Project is a template, set this to `true` and this template will be available to choose from when creating a new Project within the application. - `updatePlannedWithActual` (boolean, optional, nullable) — True if allow actual dates to update planned dates - `notes` (string, optional, nullable) — To update the project notes - `externalReferenceId` (string, optional, nullable) — An optional external reference identifier for this Project. This value can be used to link the Project to records in external systems, such as ERP, CRM, or other integrations. ## 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` ## Types ### 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. ## Examples **Request** ```json {} ``` **Response** ```json { "error": { "technicalError": "string", "additionalErrors": [ "string" ], "validationErrors": {}, "message": "string" }, "success": true, "hasError": true, "statusCode": "Continue" } ``` **SDK Code** ```python import requests url = "https://api.projectmanager.com/api/data/projects/projectId" 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/projects/projectId'; 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/projects/projectId" 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/projects/projectId") 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/projects/projectId") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("{}") .asString(); ``` ```php request('PUT', 'https://api.projectmanager.com/api/data/projects/projectId', [ 'body' => '{}', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.projectmanager.com/api/data/projects/projectId"); 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/projects/projectId")! 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() ```