> 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/create-many-tasks/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.projectmanager.com/_mcp/server. # Create Many Tasks POST https://api.projectmanager.com/api/data/projects/{projectId}/tasks/bulk Content-Type: application/json Create multiple new Tasks within a specified project with a single API call. 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. Reference: https://developer.projectmanager.com/api-reference/task/create-many-tasks ## 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 that will contain these Tasks ### 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 list of TaskCreateDto. - `list of TaskCreateDto` ## 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` (list of ChangeSetStatusDto, optional) — If the API call succeeded, this will contain the results. ## Types ### TaskCreateDto 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. - `name` (string, required) — 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 unique identifier of the TaskStatus for this Task - `priorityId` (integer, optional, nullable) — A numerical value representing the Priority of this Task - `assignees` (list of string, optional, nullable) — A list of unique identifiers of TaskAssignees to be assigned to this Task - `plannedStartDate` (string, optional, nullable) — The date when work on this Task is planned to begin. - `plannedFinishDate` (string, optional, nullable) — The date when work on this Task is expected to complete. - `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) — The date when work on this Task actually started, if known. - `actualCost` (double, optional, nullable) — The actual cost of this Task to date, if known. - `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. - `parentId` (string, optional, nullable) — Gets or sets the unique identifier of the parent task. If set, this task will be a child of the specified parent task, supporting task hierarchies and sub-tasks. - `index` (integer, optional, nullable) — Gets or sets the position of the task within the list of project tasks. Used to determine the order of tasks in the project with the first task being 1. ### 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 [ { "name": "string" } ] ``` **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/projects/projectId/tasks/bulk" payload = [{ "name": "string" }] headers = { "Authorization": "Bearer ", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://api.projectmanager.com/api/data/projects/projectId/tasks/bulk'; const options = { method: 'POST', headers: {Authorization: 'Bearer ', 'Content-Type': 'application/json'}, body: '[{"name":"string"}]' }; 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/tasks/bulk" payload := strings.NewReader("[\n {\n \"name\": \"string\"\n }\n]") req, _ := http.NewRequest("POST", 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/tasks/bulk") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = 'Bearer ' request["Content-Type"] = 'application/json' request.body = "[\n {\n \"name\": \"string\"\n }\n]" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.projectmanager.com/api/data/projects/projectId/tasks/bulk") .header("Authorization", "Bearer ") .header("Content-Type", "application/json") .body("[\n {\n \"name\": \"string\"\n }\n]") .asString(); ``` ```php request('POST', 'https://api.projectmanager.com/api/data/projects/projectId/tasks/bulk', [ 'body' => '[ { "name": "string" } ]', '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/tasks/bulk"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "Bearer "); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "[\n {\n \"name\": \"string\"\n }\n]", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "Bearer ", "Content-Type": "application/json" ] let parameters = [["name": "string"]] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.projectmanager.com/api/data/projects/projectId/tasks/bulk")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" 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() ```