On this page
addNote
mutation · in the family Work and notes
What it does
Attach a note (optionally with files) to any record — an order, a product, a customer.
Append ONE immutable note to ANY same-tenant construct: the target gates existence + same-rootId (its type stamps onto the row); parentNoteId threads ONE level (a reply-to-a-reply refuses naming the root); links ≤8 scheme-fenced; attachmentIds bind the caller's own PRIOR upload-mints — the commit HeadObject-verifies each blob, composes the IMMUTABLE META, flips the pending tag, stamps the wallet counter, and mints the BLOBBOOK rows, ALL in ONE transaction. The acting User stamps as the author. Requires the unrestricted capability. Template class (universal staff work — hand-derived v29).
What happens
Notes are permanent, threaded one level, and travel with the record; attachments are virus-screened where required.
Careful
Notes cannot be edited or deleted — write what you would be comfortable seeing in an audit.
Who may call it
Capability area: Work and notes — Tasks, notes, messages, dashboards and the everyday tools every staff member keeps.
- Owner
- System Administrator
- Manager
- Associate Manager
- Warehouse Associate
- Sales Associate
- Cashier
- An API key whose scope allows
api:addNote
Arguments
| Name | Type | Required | Notes |
|---|---|---|---|
input | NewNoteInput NewNoteInput! | yes | No further notes. |
Returns
Note Note! — One generic note on ANY same-tenant construct. Internal-only in v1 (no consumer face — CsCase owns that lane).
Example request
mutation ExampleAddNote($input: NewNoteInput!) {
addNote(input: $input) {
id
type
caption
status
parentId
rootId
createdAt
updatedAt
revisionNum
revision
targetType
authorId
parentNoteId
title
kind
body
labelIds
taskId
}
}
Variables:
{
"input": {
"targetConstructId": "01900000-0000-7000-8000-79e077380000",
"targetType": "<target type>",
"body": "Restock before the weekend.",
"parentNoteId": "01900000-0000-7000-8000-907baa100000"
}
}
Send it with the envelope naming the version: "extensions": {"at": {"version": {"name":"genesis","number":0}}}.
Example response
{
"data": {
"addNote": {
"id": "01900000-0000-7000-8000-37386ae00000",
"type": "<type>",
"caption": "Blue jeans",
"status": "<status>",
"parentId": "01900000-0000-7000-8000-065235280000",
"rootId": "01900000-0000-7000-8000-a093dd800000",
"createdAt": "2027-01-31T00:00:00.000Z",
"updatedAt": "2027-01-31T00:00:00.000Z",
"revisionNum": 1,
"revision": "01900000-0000-7000-8000-b7960e180000",
"targetType": "<target type>",
"authorId": "01900000-0000-7000-8000-0046e40b0000",
"parentNoteId": "01900000-0000-7000-8000-907baa100000",
"title": "Blue jeans",
"kind": "<kind>",
"body": "Restock before the weekend.",
"labelIds": [
"01900000-0000-7000-8000-a235e7410000"
],
"taskId": "01900000-0000-7000-8000-6ceba5410000"
}
},
"extensions": {
"at": {
"callId": "01EXAMPLE-CALL-ID",
"version": {
"requested": {
"name": "genesis",
"number": 0
},
"serviced": {
"name": "genesis",
"number": 0
}
}
}
}
}
Errors this call can answer
VALIDATION/INVALID— Something in the request is not valid. (VALIDATION)AUTHN/REQUIRED— Sign in to do this. (AUTHN)AUTHZ/FORBIDDEN— Your role does not allow this action. (AUTHZ)RATE_LIMIT/THROTTLED— Too many requests in a short time. (RATE_LIMIT)NOT_FOUND/*— That record could not be found. (NOT_FOUND)CONFLICT/*— The record’s state, or a change made in the meantime, does not allow this; the codes are on the CONFLICT page. (CONFLICT)VALIDATION/VERSION_REQUIRED— The request did not say which app version it came from. (VALIDATION)