Projects
Projects. projectcode is the display id (TPM-001).
The object#
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| name | string(200) | Project name. |
| projectcode | string(20) | Short code identifying the project. |
| description | text | Description. Stored as text, no practical length limit. |
| status | string | Status. Labels are Teamproject_model::$statuses; stored as an int and never exposed or accepted as one (D35). One of notstarted, inprogress, onhold, completed, cancelled. |
| priority | string | Priority. Labels are Teamproject_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical. |
| manageruserid | integer | Reference to genusers, by id. Write either this or manageruser. |
| manageruser | string(50) | Login name of the project manager. Send this or manageruserid, not both unless they agree. |
| teamprojectcategoryid | integer | Reference to teamprojectcategories, by id. Write either this or teamprojectcategory. |
| teamprojectcategory | string(100) | Code for the referenced teamprojectcategory, instead of the id. |
| color | string(10) | Display colour, hex. |
| startdate | string | Date the project starts. |
| targetenddate | string | Date the project is planned to finish. |
| actualenddate | string | Date the project actually finished. |
| budgethoursmoney | string(6dp) | Stored as decimal(18,6). |
| budgetamountmoney | string(4dp) | Stored as decimal(19,4). |
| percentcomplete | integer | Progress, 0 to 100. |
| customerid | integer | Reference to customers, by id. Write either this or customer. |
| customer | string(30) | Code for the referenced customer, instead of the id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| worktypeid | integer | Reference to worktypes, by id. Write either this or worktype. |
| worktype | string(100) | Code for the referenced worktype, instead of the id. |
| sortorder | integer | Display order. Lower sorts first. |
| externalid | string(100) | Your own key. Scoped to your company. |
Endpoints#
Create many.
Requires scope projects:write.
| Name | In | Type | Notes |
|---|---|---|---|
| Field | Type | Description |
|---|---|---|
| name | string(200) | Project name. |
| projectcode | string(20) | Short code identifying the project. |
| description | text | Description. Stored as text, no practical length limit. |
| status | string | Status. Labels are Teamproject_model::$statuses; stored as an int and never exposed or accepted as one (D35). One of notstarted, inprogress, onhold, completed, cancelled. |
| priority | string | Priority. Labels are Teamproject_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical. |
| manageruserid | integer | Reference to genusers, by id. Write either this or manageruser. |
| manageruser | string(50) | Login name of the project manager. Send this or manageruserid, not both unless they agree. |
| teamprojectcategoryid | integer | Reference to teamprojectcategories, by id. Write either this or teamprojectcategory. |
| teamprojectcategory | string(100) | Code for the referenced teamprojectcategory, instead of the id. |
| color | string(10) | Display colour, hex. |
| startdate | string | Date the project starts. |
| targetenddate | string | Date the project is planned to finish. |
| actualenddate | string | Date the project actually finished. |
| budgethoursmoney | string(6dp) | Stored as decimal(18,6). |
| budgetamountmoney | string(4dp) | Stored as decimal(19,4). |
| percentcomplete | integer | Progress, 0 to 100. |
| customerid | integer | Reference to customers, by id. Write either this or customer. |
| customer | string(30) | Code for the referenced customer, instead of the id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| worktypeid | integer | Reference to worktypes, by id. Write either this or worktype. |
| worktype | string(100) | Code for the referenced worktype, instead of the id. |
| sortorder | integer | Display order. Lower sorts first. |
| externalid | string(100) | Your own key. Scoped to your company. |
| milestones | array of RefTeamprojectmilestonesCreate | Milestones created under this project, in order. Each may carry its own tasks. |
| tasks | array of RefTeamprojecttasksCreate | Tasks created directly on the project, with no milestone. Use the tasks inside a milestone for tasks that belong to one. |
curl -X POST \ 'https://acme.nolapro.com/!/api/v2/teamprojects/batch' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '[ { "status": "notstarted", "priority": "low", "milestones": [ { "status": "pending", "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": false, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104 } ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104 } ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104 } ] } ] } ], "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": false, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104 } ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104 } ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104 } ] } ] } ]'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects/batch'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ [ 'status' => 'notstarted', 'priority' => 'low', 'milestones' => [ [ 'status' => 'pending', 'tasks' => [ [ 'priority' => 'low', 'approvalstatus' => 'notrequested', 'checklist' => [ [ 'title' => 'Example title', 'iscomplete' => false, 'sortorder' => 1, 'parentchecklistid' => 104, 'teamprojecttaskid' => 104, ], ], 'assignees' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'watchers' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'tags' => [ [ 'teamprojecttagid' => 104, 'teamprojecttag' => 'Example teamprojecttag', 'teamprojecttaskid' => 104, ], ], 'comments' => [ [ 'parentcommentid' => 104, 'comment' => 'Example comment', 'teamprojecttaskid' => 104, ], ], ], ], ], ], 'tasks' => [ [ 'priority' => 'low', 'approvalstatus' => 'notrequested', 'checklist' => [ [ 'title' => 'Example title', 'iscomplete' => false, 'sortorder' => 1, 'parentchecklistid' => 104, 'teamprojecttaskid' => 104, ], ], 'assignees' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'watchers' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'tags' => [ [ 'teamprojecttagid' => 104, 'teamprojecttag' => 'Example teamprojecttag', 'teamprojecttaskid' => 104, ], ], 'comments' => [ [ 'parentcommentid' => 104, 'comment' => 'Example comment', 'teamprojecttaskid' => 104, ], ], ], ], ], ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.post( "https://acme.nolapro.com/!/api/v2/teamprojects/batch", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json=[ { "status": "notstarted", "priority": "low", "milestones": [ { "status": "pending", "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": False, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104, }, ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104, }, ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104, }, ], }, ], }, ], "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": False, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104, }, ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104, }, ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104, }, ], }, ], }, ], ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects/batch', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify([ { status: "notstarted", priority: "low", milestones: [ { status: "pending", tasks: [ { priority: "low", approvalstatus: "notrequested", checklist: [ { title: "Example title", iscomplete: false, sortorder: 1, parentchecklistid: 104, teamprojecttaskid: 104, }, ], assignees: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], watchers: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], tags: [ { teamprojecttagid: 104, teamprojecttag: "Example teamprojecttag", teamprojecttaskid: 104, }, ], comments: [ { parentcommentid: 104, comment: "Example comment", teamprojecttaskid: 104, }, ], }, ], }, ], tasks: [ { priority: "low", approvalstatus: "notrequested", checklist: [ { title: "Example title", iscomplete: false, sortorder: 1, parentchecklistid: 104, teamprojecttaskid: 104, }, ], assignees: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], watchers: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], tags: [ { teamprojecttagid: 104, teamprojecttag: "Example teamprojecttag", teamprojecttaskid: 104, }, ], comments: [ { parentcommentid: 104, comment: "Example comment", teamprojecttaskid: 104, }, ], }, ], }, ]), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new[] { new { status = "notstarted", priority = "low", milestones = new[] { new { status = "pending", tasks = new[] { new { priority = "low", approvalstatus = "notrequested", checklist = new[] { new { title = "Example title", iscomplete = false, sortorder = 1, parentchecklistid = 104, teamprojecttaskid = 104, }, }, assignees = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, watchers = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, tags = new[] { new { teamprojecttagid = 104, teamprojecttag = "Example teamprojecttag", teamprojecttaskid = 104, }, }, comments = new[] { new { parentcommentid = 104, comment = "Example comment", teamprojecttaskid = 104, }, }, }, }, }, }, tasks = new[] { new { priority = "low", approvalstatus = "notrequested", checklist = new[] { new { title = "Example title", iscomplete = false, sortorder = 1, parentchecklistid = 104, teamprojecttaskid = 104, }, }, assignees = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, watchers = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, tags = new[] { new { teamprojecttagid = 104, teamprojecttag = "Example teamprojecttag", teamprojecttaskid = 104, }, }, comments = new[] { new { parentcommentid = 104, comment = "Example comment", teamprojecttaskid = 104, }, }, }, }, }, }; var req = new HttpRequestMessage(HttpMethod.Post, "https://acme.nolapro.com/!/api/v2/teamprojects/batch") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
List projects.
Requires scope projects:read.
| Name | In | Type | Notes |
|---|---|---|---|
| status | query | string | Restrict to one status. |
| customerid | query | string | Restrict to one customerid. |
| vendorid | query | string | Restrict to one vendorid. |
| name | query | string | name. Partial match, case-insensitive. |
| description | query | string | description. Partial match, case-insensitive. |
| projectcode | query | string | Partial match, case insensitive. |
| cancel | query | string | Defaults to false. Pass true or any. |
| modifiedsince | query | string | RFC 3339 UTC timestamp. Returns only records changed since then, including cancelled ones - so cancel defaults to any rather than false when this is used. The response carries _meta.synced_through; store it and send it back next time. |
| externalid | query | string | Exact match on your own key. |
| include | query | string | Comma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions. |
| Status | Code | Meaning |
|---|---|---|
| 403 | insufficient_scope | Token lacks read scope. |
curl \ 'https://acme.nolapro.com/!/api/v2/teamprojects' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.get( "https://acme.nolapro.com/!/api/v2/teamprojects", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects', { method: 'GET', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var res = await http.GetAsync( "https://acme.nolapro.com/!/api/v2/teamprojects"); res.EnsureSuccessStatusCode();
Create.
Creates a project. Optionally send milestones and tasks in the same request: the project is created first, then each child is attached to the new id, all inside one transaction. The response echoes the tree in the order you sent it, with real ids, so you can map your input positions.
Requires scope projects:write.
| Name | In | Type | Notes |
|---|---|---|---|
| Field | Type | Description |
|---|---|---|
| name | string(200) | Project name. |
| projectcode | string(20) | Short code identifying the project. |
| description | text | Description. Stored as text, no practical length limit. |
| status | string | Status. Labels are Teamproject_model::$statuses; stored as an int and never exposed or accepted as one (D35). One of notstarted, inprogress, onhold, completed, cancelled. |
| priority | string | Priority. Labels are Teamproject_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical. |
| manageruserid | integer | Reference to genusers, by id. Write either this or manageruser. |
| manageruser | string(50) | Login name of the project manager. Send this or manageruserid, not both unless they agree. |
| teamprojectcategoryid | integer | Reference to teamprojectcategories, by id. Write either this or teamprojectcategory. |
| teamprojectcategory | string(100) | Code for the referenced teamprojectcategory, instead of the id. |
| color | string(10) | Display colour, hex. |
| startdate | string | Date the project starts. |
| targetenddate | string | Date the project is planned to finish. |
| actualenddate | string | Date the project actually finished. |
| budgethoursmoney | string(6dp) | Stored as decimal(18,6). |
| budgetamountmoney | string(4dp) | Stored as decimal(19,4). |
| percentcomplete | integer | Progress, 0 to 100. |
| customerid | integer | Reference to customers, by id. Write either this or customer. |
| customer | string(30) | Code for the referenced customer, instead of the id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| worktypeid | integer | Reference to worktypes, by id. Write either this or worktype. |
| worktype | string(100) | Code for the referenced worktype, instead of the id. |
| sortorder | integer | Display order. Lower sorts first. |
| externalid | string(100) | Your own key. Scoped to your company. |
| milestones | array of RefTeamprojectmilestonesCreate | Milestones created under this project, in order. Each may carry its own tasks. |
| tasks | array of RefTeamprojecttasksCreate | Tasks created directly on the project, with no milestone. Use the tasks inside a milestone for tasks that belong to one. |
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A required field was missing. |
curl -X POST \ 'https://acme.nolapro.com/!/api/v2/teamprojects' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '{ "status": "notstarted", "priority": "low", "milestones": [ { "status": "pending", "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": false, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104 } ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104 } ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104 } ] } ] } ], "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": false, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104 } ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104 } ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104 } ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104 } ] } ] }'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ 'status' => 'notstarted', 'priority' => 'low', 'milestones' => [ [ 'status' => 'pending', 'tasks' => [ [ 'priority' => 'low', 'approvalstatus' => 'notrequested', 'checklist' => [ [ 'title' => 'Example title', 'iscomplete' => false, 'sortorder' => 1, 'parentchecklistid' => 104, 'teamprojecttaskid' => 104, ], ], 'assignees' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'watchers' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'tags' => [ [ 'teamprojecttagid' => 104, 'teamprojecttag' => 'Example teamprojecttag', 'teamprojecttaskid' => 104, ], ], 'comments' => [ [ 'parentcommentid' => 104, 'comment' => 'Example comment', 'teamprojecttaskid' => 104, ], ], ], ], ], ], 'tasks' => [ [ 'priority' => 'low', 'approvalstatus' => 'notrequested', 'checklist' => [ [ 'title' => 'Example title', 'iscomplete' => false, 'sortorder' => 1, 'parentchecklistid' => 104, 'teamprojecttaskid' => 104, ], ], 'assignees' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'watchers' => [ [ 'genuser' => 'Example genuser', 'teamprojecttaskid' => 104, ], ], 'tags' => [ [ 'teamprojecttagid' => 104, 'teamprojecttag' => 'Example teamprojecttag', 'teamprojecttaskid' => 104, ], ], 'comments' => [ [ 'parentcommentid' => 104, 'comment' => 'Example comment', 'teamprojecttaskid' => 104, ], ], ], ], ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.post( "https://acme.nolapro.com/!/api/v2/teamprojects", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json={ "status": "notstarted", "priority": "low", "milestones": [ { "status": "pending", "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": False, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104, }, ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104, }, ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104, }, ], }, ], }, ], "tasks": [ { "priority": "low", "approvalstatus": "notrequested", "checklist": [ { "title": "Example title", "iscomplete": False, "sortorder": 1, "parentchecklistid": 104, "teamprojecttaskid": 104, }, ], "assignees": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "watchers": [ { "genuser": "Example genuser", "teamprojecttaskid": 104, }, ], "tags": [ { "teamprojecttagid": 104, "teamprojecttag": "Example teamprojecttag", "teamprojecttaskid": 104, }, ], "comments": [ { "parentcommentid": 104, "comment": "Example comment", "teamprojecttaskid": 104, }, ], }, ], }, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify({ status: "notstarted", priority: "low", milestones: [ { status: "pending", tasks: [ { priority: "low", approvalstatus: "notrequested", checklist: [ { title: "Example title", iscomplete: false, sortorder: 1, parentchecklistid: 104, teamprojecttaskid: 104, }, ], assignees: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], watchers: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], tags: [ { teamprojecttagid: 104, teamprojecttag: "Example teamprojecttag", teamprojecttaskid: 104, }, ], comments: [ { parentcommentid: 104, comment: "Example comment", teamprojecttaskid: 104, }, ], }, ], }, ], tasks: [ { priority: "low", approvalstatus: "notrequested", checklist: [ { title: "Example title", iscomplete: false, sortorder: 1, parentchecklistid: 104, teamprojecttaskid: 104, }, ], assignees: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], watchers: [ { genuser: "Example genuser", teamprojecttaskid: 104, }, ], tags: [ { teamprojecttagid: 104, teamprojecttag: "Example teamprojecttag", teamprojecttaskid: 104, }, ], comments: [ { parentcommentid: 104, comment: "Example comment", teamprojecttaskid: 104, }, ], }, ], }), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new { status = "notstarted", priority = "low", milestones = new[] { new { status = "pending", tasks = new[] { new { priority = "low", approvalstatus = "notrequested", checklist = new[] { new { title = "Example title", iscomplete = false, sortorder = 1, parentchecklistid = 104, teamprojecttaskid = 104, }, }, assignees = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, watchers = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, tags = new[] { new { teamprojecttagid = 104, teamprojecttag = "Example teamprojecttag", teamprojecttaskid = 104, }, }, comments = new[] { new { parentcommentid = 104, comment = "Example comment", teamprojecttaskid = 104, }, }, }, }, }, }, tasks = new[] { new { priority = "low", approvalstatus = "notrequested", checklist = new[] { new { title = "Example title", iscomplete = false, sortorder = 1, parentchecklistid = 104, teamprojecttaskid = 104, }, }, assignees = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, watchers = new[] { new { genuser = "Example genuser", teamprojecttaskid = 104, }, }, tags = new[] { new { teamprojecttagid = 104, teamprojecttag = "Example teamprojecttag", teamprojecttaskid = 104, }, }, comments = new[] { new { parentcommentid = 104, comment = "Example comment", teamprojecttaskid = 104, }, }, }, }, }; var req = new HttpRequestMessage(HttpMethod.Post, "https://acme.nolapro.com/!/api/v2/teamprojects") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"status": "notstarted",
"priority": "low"
}
Retrieve one record.
Requires scope projects:read.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| include | query | string | Comma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl \ 'https://acme.nolapro.com/!/api/v2/teamprojects/104' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.get( "https://acme.nolapro.com/!/api/v2/teamprojects/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects/104', { method: 'GET', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var res = await http.GetAsync( "https://acme.nolapro.com/!/api/v2/teamprojects/104"); res.EnsureSuccessStatusCode();
{
"status": "notstarted",
"priority": "low"
}
Update.
Only the fields you send change. Children cannot be sent here - milestones and tasks are create-only (see Conventions). Use the child resource to add, change or cancel one.
Requires scope projects:write.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| name | string(200) | Project name. |
| projectcode | string(20) | Short code identifying the project. |
| description | text | Description. Stored as text, no practical length limit. |
| status | string | Status. Labels are Teamproject_model::$statuses; stored as an int and never exposed or accepted as one (D35). One of notstarted, inprogress, onhold, completed, cancelled. |
| priority | string | Priority. Labels are Teamproject_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical. |
| manageruserid | integer | Reference to genusers, by id. Write either this or manageruser. |
| manageruser | string(50) | Login name of the project manager. Send this or manageruserid, not both unless they agree. |
| teamprojectcategoryid | integer | Reference to teamprojectcategories, by id. Write either this or teamprojectcategory. |
| teamprojectcategory | string(100) | Code for the referenced teamprojectcategory, instead of the id. |
| color | string(10) | Display colour, hex. |
| startdate | string | Date the project starts. |
| targetenddate | string | Date the project is planned to finish. |
| actualenddate | string | Date the project actually finished. |
| budgethoursmoney | string(6dp) | Stored as decimal(18,6). |
| budgetamountmoney | string(4dp) | Stored as decimal(19,4). |
| percentcomplete | integer | Progress, 0 to 100. |
| customerid | integer | Reference to customers, by id. Write either this or customer. |
| customer | string(30) | Code for the referenced customer, instead of the id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| worktypeid | integer | Reference to worktypes, by id. Write either this or worktype. |
| worktype | string(100) | Code for the referenced worktype, instead of the id. |
| sortorder | integer | Display order. Lower sorts first. |
| externalid | string(100) | Your own key. Scoped to your company. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl -X PATCH \ 'https://acme.nolapro.com/!/api/v2/teamprojects/104' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '{ "status": "notstarted", "priority": "low" }'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_POSTFIELDS => json_encode([ 'status' => 'notstarted', 'priority' => 'low', ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.patch( "https://acme.nolapro.com/!/api/v2/teamprojects/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json={ "status": "notstarted", "priority": "low", }, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects/104', { method: 'PATCH', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify({ status: "notstarted", priority: "low", }), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new { status = "notstarted", priority = "low", }; var req = new HttpRequestMessage(HttpMethod.Patch, "https://acme.nolapro.com/!/api/v2/teamprojects/104") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"status": "notstarted",
"priority": "low"
}
Cancel.
Requires scope projects:cancel.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl -X DELETE \ 'https://acme.nolapro.com/!/api/v2/teamprojects/104' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/teamprojects/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'DELETE', ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.delete( "https://acme.nolapro.com/!/api/v2/teamprojects/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/teamprojects/104', { method: 'DELETE', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var req = new HttpRequestMessage(HttpMethod.Delete, "https://acme.nolapro.com/!/api/v2/teamprojects/104"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"status": "notstarted",
"priority": "low"
}