File categories

Labels attachments are filed under ("Receipts", "Signed contracts"). Per company. The target of filecategoryid on an attachment. name is unique per company, case-insensitive and trimmed: the File Categories screen does not enforce that, so a duplicate created there is something the API will refuse to add a third of, and creating a name that matches a cancelled category revives it (200, the original id, record_reactivated in _meta.warnings) rather than adding a second row.

The object#

FieldTypeDescription
idread-onlyintegerNolaPro id. What filecategoryid on an attachment stores.
namestring(255)The category name as it appears in the file list. Trimmed on input. Unique per company, case-insensitive, so receipts and Receipts are the same category.
cancelread-onlybooleanTrue once cancelled. Attachments filed under a cancelled category keep pointing at it.
externalidstring(100)Your own key for this category. Scoped to your company.
lastchangedateread-onlystringLast modification, as recorded by the code that made it. This column is not maintained by the database, so it is informational only and does NOT drive modifiedsince - this resource has no delta cursor.

Endpoints#

GET/filecategories 200403

List file categories.

Requires scope setup:read.

Parameters
NameInTypeNotes
namequerystringPartial match, case insensitive.
cancelquerystringDefaults to false. Pass true for cancelled only, or any.
externalidquerystringExact match on your own key. Scoped to your company.
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 setup:read.
curl \
  'https://acme.nolapro.com/!/api/v2/filecategories' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/filecategories 201400409403

Create a file category.

Creates a category for this company. If an active category already has that name (case-insensitive, trimmed) the request is refused with 409 duplicate and the body names its id. If a cancelled one does, it is reactivated instead: the response is 200, not 201, carries the original id, and _meta.warnings contains record_reactivated.

Requires scope setup: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
idread-onlyintegerNolaPro id. What filecategoryid on an attachment stores.
namestring(255)The category name as it appears in the file list. Trimmed on input. Unique per company, case-insensitive, so receipts and Receipts are the same category.
cancelread-onlybooleanTrue once cancelled. Attachments filed under a cancelled category keep pointing at it.
externalidstring(100)Your own key for this category. Scoped to your company.
lastchangedateread-onlystringLast modification, as recorded by the code that made it. This column is not maintained by the database, so it is informational only and does NOT drive modifiedsince - this resource has no delta cursor.
When it fails
StatusCodeMeaning
400invalid_requestname was missing, empty, whitespace only, or over 255 characters.
409duplicateAn active category already has that name. The body names its id.
403insufficient_scopeToken lacks setup:write.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/filecategories' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}'
Response 201
{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}
GET/filecategories/{id} 200404

Retrieve one category.

Requires scope setup:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe category 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 category with that id.
curl \
  'https://acme.nolapro.com/!/api/v2/filecategories/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}
PATCH/filecategories/{id} 200400404409

Update a category.

Requires scope setup:write.

Parameters
NameInTypeNotes
idrequiredpathintegerThe category 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. What filecategoryid on an attachment stores.
namestring(255)The category name as it appears in the file list. Trimmed on input. Unique per company, case-insensitive, so receipts and Receipts are the same category.
cancelread-onlybooleanTrue once cancelled. Attachments filed under a cancelled category keep pointing at it.
externalidstring(100)Your own key for this category. Scoped to your company.
lastchangedateread-onlystringLast modification, as recorded by the code that made it. This column is not maintained by the database, so it is informational only and does NOT drive modifiedsince - this resource has no delta cursor.
When it fails
StatusCodeMeaning
400invalid_requestname was empty or too long.
404not_foundNo category with that id.
409duplicateAnother active category already has that name.
curl -X PATCH \
  'https://acme.nolapro.com/!/api/v2/filecategories/104' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}'
Response 200
{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}
DELETE/filecategories/{id} 200403404

Cancel a category.

Sets the cancel flag. Nothing is removed, and attachments already filed under it keep their filecategoryid. Needs setup:cancel, which setup:write does not imply. Cancelling an already cancelled category succeeds.

Requires scope setup:cancel.

Parameters
NameInTypeNotes
idrequiredpathintegerThe category 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
403insufficient_scopeToken has setup:write but not setup:cancel.
404not_foundNo category with that id.
curl -X DELETE \
  'https://acme.nolapro.com/!/api/v2/filecategories/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "id": 3,
    "name": "Receipts",
    "cancel": false,
    "externalid": "RCPT",
    "lastchangedate": "2026-09-21T14:02:11Z"
}
POST/filecategories/batch 207400

Create many.

Always answers 207, one result per item. Each item is validated exactly as a single POST is, including the duplicate and reactivation rules.

Requires scope setup: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
idread-onlyintegerNolaPro id. What filecategoryid on an attachment stores.
namestring(255)The category name as it appears in the file list. Trimmed on input. Unique per company, case-insensitive, so receipts and Receipts are the same category.
cancelread-onlybooleanTrue once cancelled. Attachments filed under a cancelled category keep pointing at it.
externalidstring(100)Your own key for this category. Scoped to your company.
lastchangedateread-onlystringLast modification, as recorded by the code that made it. This column is not maintained by the database, so it is informational only and does NOT drive modifiedsince - this resource has no delta cursor.
When it fails
StatusCodeMeaning
400invalid_requestThe envelope was wrong - not an array, or over the size cap.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/filecategories/batch' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '[
    {
        "id": 3,
        "name": "Receipts",
        "cancel": false,
        "externalid": "RCPT",
        "lastchangedate": "2026-09-21T14:02:11Z"
    }
]'