Tasks

Tasks. parenttaskid nests one level only; taskseq is the per-project number.

Licensed feature

This resource needs the teamproject feature active on the install you are calling. Without that every endpoint here answers 403 with feature_not_licensed - that is a licensing answer, not a permissions one, so check the company's features before the token's scopes.

The object#

FieldTypeDescription
idread-onlyintegerNolaPro id.
teamprojectidintegerReference to teamprojects, by id. Write either this or teamproject.
teamprojectstring(30)Code for the referenced teamproject, instead of the id.
teamprojectmilestoneidintegerTeamprojectmilestoneid. Id only - teamprojectmilestone is read-only or has no code key.
parenttaskidintegerParenttaskid. Id only.
taskseqintegerPer-project sequence number. Assigned automatically (MAX+1 for the project) when omitted on create; send one only to control it explicitly.
displayidread-onlystring(30)The task id shown everywhere in TPM (TPM-001-15). Derived by the model from the project code and taskseq on every save. Read-only - a sent value would be silently overwritten, so it is refused instead.
titlestring(255)Task title.
descriptiontextDescription. Stored as text, no practical length limit.
teamprojectstatusidintegerReference to teamprojectstatuses, by id. Write either this or teamprojectstatus.
teamprojectstatusstring(100)Code for the referenced teamprojectstatus, instead of the id.
prioritystringPriority. Labels are Teamprojecttask_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical.
startdatestringDate work on the task starts.
duedatestringDate payment is due.
estimatedhoursmoneystring(6dp)Stored as decimal(18,6).
percentcompleteintegerProgress, 0 to 100.
sortorderintegerDisplay order. Lower sorts first.
requiresapprovalbooleanTrue routes task completion through an approval step.
approvaluseridintegerReference to genusers, by id. Write either this or approvaluser.
approvaluserstring(50)Login name of the approver. Send this or approvaluserid, not both unless they agree.
approvalstatusstringApproval workflow state. Labels are Teamprojecttask_model::$approvalstatuses; stored as an int and never exposed or accepted as one (D35). Only meaningful when requiresapproval is true. One of notrequested, pending, approved, rejected.
approvaldatestringDate the completed task was approved.
approvalcommenttextApprovalcomment. Stored as text, no practical length limit.
cancelbooleanCancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable.
entrydateread-onlystringWhen the record was created.
lastchangedateread-onlystringLast modification. Drives modifiedsince.
worktypeidintegerReference to worktypes, by id. Write either this or worktype.
worktypestring(100)Code for the referenced worktype, instead of the id.
externalidstring(100)Your own key. Scoped to your company.

Endpoints#

POST/teamprojecttasks/batch 207

Create many.

Requires scope projects:write.

Parameters
NameInTypeNotes
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body array
FieldTypeDescription
parenttaskidintegerParenttaskid. Id only.
taskseqintegerPer-project sequence number. Assigned automatically (MAX+1 for the project) when omitted on create; send one only to control it explicitly.
displayidread-onlystring(30)The task id shown everywhere in TPM (TPM-001-15). Derived by the model from the project code and taskseq on every save. Read-only - a sent value would be silently overwritten, so it is refused instead.
titlestring(255)Task title.
descriptiontextDescription. Stored as text, no practical length limit.
teamprojectstatusidintegerReference to teamprojectstatuses, by id. Write either this or teamprojectstatus.
teamprojectstatusstring(100)Code for the referenced teamprojectstatus, instead of the id.
prioritystringPriority. Labels are Teamprojecttask_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical.
startdatestringDate work on the task starts.
duedatestringDate payment is due.
estimatedhoursmoneystring(6dp)Stored as decimal(18,6).
percentcompleteintegerProgress, 0 to 100.
sortorderintegerDisplay order. Lower sorts first.
requiresapprovalbooleanTrue routes task completion through an approval step.
approvaluseridintegerReference to genusers, by id. Write either this or approvaluser.
approvaluserstring(50)Login name of the approver. Send this or approvaluserid, not both unless they agree.
approvalstatusstringApproval workflow state. Labels are Teamprojecttask_model::$approvalstatuses; stored as an int and never exposed or accepted as one (D35). Only meaningful when requiresapproval is true. One of notrequested, pending, approved, rejected.
approvaldatestringDate the completed task was approved.
approvalcommenttextApprovalcomment. Stored as text, no practical length limit.
cancelbooleanCancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable.
entrydateread-onlystringWhen the record was created.
worktypeidintegerReference to worktypes, by id. Write either this or worktype.
worktypestring(100)Code for the referenced worktype, instead of the id.
externalidstring(100)Your own key. Scoped to your company.
checklistarray of RefTeamprojectchecklistsCreateChecklist items on this task, in order.
assigneesarray of RefTeamprojecttaskassigneesCreateWho the task is assigned to.
watchersarray of RefTeamprojecttaskwatchersCreateWho gets notified about it.
tagsarray of RefTeamprojecttasktagsCreateTags to attach. The tag itself must already exist.
commentsarray of RefTeamprojectcommentsCreateAn opening comment or two.
teamprojectidintegerReference to teamprojects, by id. Write either this or teamproject.
teamprojectstring(30)Code for the referenced teamproject, instead of the id.
teamprojectmilestoneidintegerTeamprojectmilestoneid. Id only - teamprojectmilestone is read-only or has no code key.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/batch' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '[
    {
        "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
            }
        ]
    }
]'
GET/teamprojecttasks 200403

List tasks.

Requires scope projects:read.

Parameters
NameInTypeNotes
descriptionquerystringdescription. Partial match, case-insensitive.
titlequerystringPartial match, case insensitive.
cancelquerystringDefaults to false. Pass true or any.
modifiedsincequerystringRFC 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.
externalidquerystringExact match on your own key.
teamprojectidquerystringFilter to one .
includequerystringComma-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.
When it fails
StatusCodeMeaning
403insufficient_scopeToken lacks read scope.
curl \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/teamprojecttasks 201400

Create.

Requires scope projects:write.

Parameters
NameInTypeNotes
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body
FieldTypeDescription
parenttaskidintegerParenttaskid. Id only.
taskseqintegerPer-project sequence number. Assigned automatically (MAX+1 for the project) when omitted on create; send one only to control it explicitly.
displayidread-onlystring(30)The task id shown everywhere in TPM (TPM-001-15). Derived by the model from the project code and taskseq on every save. Read-only - a sent value would be silently overwritten, so it is refused instead.
titlestring(255)Task title.
descriptiontextDescription. Stored as text, no practical length limit.
teamprojectstatusidintegerReference to teamprojectstatuses, by id. Write either this or teamprojectstatus.
teamprojectstatusstring(100)Code for the referenced teamprojectstatus, instead of the id.
prioritystringPriority. Labels are Teamprojecttask_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical.
startdatestringDate work on the task starts.
duedatestringDate payment is due.
estimatedhoursmoneystring(6dp)Stored as decimal(18,6).
percentcompleteintegerProgress, 0 to 100.
sortorderintegerDisplay order. Lower sorts first.
requiresapprovalbooleanTrue routes task completion through an approval step.
approvaluseridintegerReference to genusers, by id. Write either this or approvaluser.
approvaluserstring(50)Login name of the approver. Send this or approvaluserid, not both unless they agree.
approvalstatusstringApproval workflow state. Labels are Teamprojecttask_model::$approvalstatuses; stored as an int and never exposed or accepted as one (D35). Only meaningful when requiresapproval is true. One of notrequested, pending, approved, rejected.
approvaldatestringDate the completed task was approved.
approvalcommenttextApprovalcomment. Stored as text, no practical length limit.
cancelbooleanCancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable.
entrydateread-onlystringWhen the record was created.
worktypeidintegerReference to worktypes, by id. Write either this or worktype.
worktypestring(100)Code for the referenced worktype, instead of the id.
externalidstring(100)Your own key. Scoped to your company.
checklistarray of RefTeamprojectchecklistsCreateChecklist items on this task, in order.
assigneesarray of RefTeamprojecttaskassigneesCreateWho the task is assigned to.
watchersarray of RefTeamprojecttaskwatchersCreateWho gets notified about it.
tagsarray of RefTeamprojecttasktagsCreateTags to attach. The tag itself must already exist.
commentsarray of RefTeamprojectcommentsCreateAn opening comment or two.
teamprojectidintegerReference to teamprojects, by id. Write either this or teamproject.
teamprojectstring(30)Code for the referenced teamproject, instead of the id.
teamprojectmilestoneidintegerTeamprojectmilestoneid. Id only - teamprojectmilestone is read-only or has no code key.
When it fails
StatusCodeMeaning
400invalid_requestA required field was missing.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "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
        }
    ]
}'
Response 201
{
    "priority": "low",
    "approvalstatus": "notrequested"
}
GET/teamprojecttasks/{id} 200404

Retrieve one record.

Requires scope projects:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
includequerystringComma-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.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "priority": "low",
    "approvalstatus": "notrequested"
}
PATCH/teamprojecttasks/{id} 200404

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.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body
FieldTypeDescription
idread-onlyintegerNolaPro id.
teamprojectidintegerReference to teamprojects, by id. Write either this or teamproject.
teamprojectstring(30)Code for the referenced teamproject, instead of the id.
teamprojectmilestoneidintegerTeamprojectmilestoneid. Id only - teamprojectmilestone is read-only or has no code key.
parenttaskidintegerParenttaskid. Id only.
taskseqintegerPer-project sequence number. Assigned automatically (MAX+1 for the project) when omitted on create; send one only to control it explicitly.
displayidread-onlystring(30)The task id shown everywhere in TPM (TPM-001-15). Derived by the model from the project code and taskseq on every save. Read-only - a sent value would be silently overwritten, so it is refused instead.
titlestring(255)Task title.
descriptiontextDescription. Stored as text, no practical length limit.
teamprojectstatusidintegerReference to teamprojectstatuses, by id. Write either this or teamprojectstatus.
teamprojectstatusstring(100)Code for the referenced teamprojectstatus, instead of the id.
prioritystringPriority. Labels are Teamprojecttask_model::$priorities; stored as an int and never exposed or accepted as one (D35). One of low, normal, high, critical.
startdatestringDate work on the task starts.
duedatestringDate payment is due.
estimatedhoursmoneystring(6dp)Stored as decimal(18,6).
percentcompleteintegerProgress, 0 to 100.
sortorderintegerDisplay order. Lower sorts first.
requiresapprovalbooleanTrue routes task completion through an approval step.
approvaluseridintegerReference to genusers, by id. Write either this or approvaluser.
approvaluserstring(50)Login name of the approver. Send this or approvaluserid, not both unless they agree.
approvalstatusstringApproval workflow state. Labels are Teamprojecttask_model::$approvalstatuses; stored as an int and never exposed or accepted as one (D35). Only meaningful when requiresapproval is true. One of notrequested, pending, approved, rejected.
approvaldatestringDate the completed task was approved.
approvalcommenttextApprovalcomment. Stored as text, no practical length limit.
cancelbooleanCancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable.
entrydateread-onlystringWhen the record was created.
lastchangedateread-onlystringLast modification. Drives modifiedsince.
worktypeidintegerReference to worktypes, by id. Write either this or worktype.
worktypestring(100)Code for the referenced worktype, instead of the id.
externalidstring(100)Your own key. Scoped to your company.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl -X PATCH \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/104' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "priority": "low",
    "approvalstatus": "notrequested"
}'
Response 200
{
    "priority": "low",
    "approvalstatus": "notrequested"
}
DELETE/teamprojecttasks/{id} 200404

Cancel.

Requires scope projects:cancel.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl -X DELETE \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "priority": "low",
    "approvalstatus": "notrequested"
}
GET/teamprojecttasks/{id}/attachments 200404

List files attached to a task.

The attachments on this task, newest first. Accepted filedefinitionid values: 68 (default 68). Metadata only - each file's bytes are at GET /attachments/{id}/content.

Requires scope projects:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe task id.
filedefinitionidqueryintegerOnly files in this list. Accepted filedefinitionid values: 68 (default 68).
filecategoryidqueryintegerOnly files filed under this category.
filenamequerystringPartial match on the file name, case insensitive.
When it fails
StatusCodeMeaning
404not_foundNo task with that id in this company.
curl \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/104/attachments' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/teamprojecttasks/{id}/attachments 201400404409413415422

Attach a file to a task.

multipart/form-data with one file part; see the AttachmentUpload schema for the other parts. Accepted filedefinitionid values: 68 (default 68). Answers 201 with the attachment's metadata and Location: /attachments/{id}. Check _meta.warnings for datatype_truncated and stored_under_parent_company.

Requires scope projects:write.

Parameters
NameInTypeNotes
idrequiredpathintegerThe task id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body multipart/form-data
FieldTypeDescription
filerequiredstringThe file. Exactly one part named file; a second one, or file[], is 400 invalid_request so an idempotent retry can never half-succeed. Empty is refused. Over the cap (the smaller of APIV2_MAX_UPLOAD_BYTES, 64 MB by default, and PHP's upload_max_filesize / post_max_size) is 413 payload_too_large naming the limit that applied.
filenamestring(255)Overrides the part's file name.
notestextFree text shown beside the file.
filedefinitionidintegerOnly when the parent accepts more than one list. Anything the parent does not accept is 422 unknown_value naming the accepted ids.
filecategoryidintegerCategory by id.
filecategorystring(255)Category by name. Sent with filecategoryid and disagreeing is 422 conflicting_reference.
When it fails
StatusCodeMeaning
400unknown_parameterA form field that is not on the AttachmentUpload schema.
400invalid_typefiledefinitionid or filecategoryid that is not an integer.
404not_foundNo task with that id in this company.
409upload_limit_reachedThis file list allows a fixed number of files on a task and it is full. Remove one first.
413payload_too_largeThe file is over the cap. The body names the limit that applied.
415multipart_requiredThe body was not multipart/form-data.
422unknown_valuefiledefinitionid is not one this task accepts, or the category does not exist in this company.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/teamprojecttasks/104/attachments' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Idempotency-Key: your-unique-key' \
  -F 'file=@grant-letter-signed.pdf' \
  -F 'filename=grant-letter-signed.pdf' \
  -F 'notes=Signed copy received 21 Sep' \
  -F 'filedefinitionid=8' \
  -F 'filecategory=Receipts'