Notes API
A note holds text content with optional start/end dates, metadata, and associations to resources, groups, and tags. Each note has a type that controls its display and behavior.
List Notes
Retrieve a paginated list of notes with optional filtering.
GET /v1/notes
Query Parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
Name | string | Filter by name (partial match) |
Description | string | Filter by description (partial match) |
OwnerId | integer | Filter by owner group ID |
Groups | integer[] | Filter by associated group IDs |
Tags | integer[] | Filter by tag IDs |
Ids | integer[] | Filter by specific note IDs |
NoteTypeId | integer | Filter by note type ID |
NoteTypeIds | integer[] | Filter by multiple note type IDs |
CreatedBefore | string | Filter by creation date (ISO 8601) |
CreatedAfter | string | Filter by creation date (ISO 8601) |
UpdatedBefore | string | Filter by last-updated date (ISO 8601) |
UpdatedAfter | string | Filter by last-updated date (ISO 8601) |
StartDateBefore | string | Notes starting before this date |
StartDateAfter | string | Notes starting after this date |
EndDateBefore | string | Notes ending before this date |
EndDateAfter | string | Notes ending after this date |
Shared | boolean | Tri-state share filter. Omit to return all notes; Shared=1 (true) returns only notes with a share token; Shared=0 (false) returns only notes without one. |
MetaQuery | string[] | Filter by metadata conditions (key:value or key:OP:value) |
MRQL | string | Filter with an MRQL expression (type note is implied) |
SortBy | string[] | Sort order (e.g., created_at desc) |
Example
# List all notes
curl http://localhost:8181/v1/notes
# Filter by note type
curl "http://localhost:8181/v1/notes?NoteTypeId=1"
# Filter by owner group
curl "http://localhost:8181/v1/notes?OwnerId=5"
# Filter by date range
curl "http://localhost:8181/v1/notes?StartDateAfter=2024-01-01&StartDateBefore=2024-12-31"
Response
[
{
"ID": 1,
"Name": "Meeting Notes",
"Description": "Notes from the project kickoff meeting...",
"StartDate": "2024-01-15T10:00:00Z",
"EndDate": "2024-01-15T11:30:00Z",
"OwnerId": 5,
"NoteTypeId": 1,
"Meta": {"attendees": ["Alice", "Bob"]},
"CreatedAt": "2024-01-15T12:00:00Z",
"UpdatedAt": "2024-01-15T12:00:00Z",
"Tags": [...],
"Groups": [...],
"Resources": [...],
"NoteType": {...}
}
]
Get Single Note
Retrieve details for a specific note.
GET /v1/note?id={id}
Example
curl http://localhost:8181/v1/note?id=123
Create or Update Note
Create a new note or update an existing one.
POST /v1/note
Parameters
| Parameter | Type | Description |
|---|---|---|
ID | integer | Note ID (include to update, omit to create) |
Name | string | Note title |
Description | string | Note content/body |
OwnerId | integer | Owner group ID |
NoteTypeId | integer | Note type ID |
Groups | integer[] | Associated group IDs |
Tags | integer[] | Tag IDs |
Resources | integer[] | Associated resource IDs |
Meta | string | JSON metadata object |
StartDate | string | Start date (YYYY-MM-DDTHH:MM) |
EndDate | string | End date (YYYY-MM-DDTHH:MM) |
Example - Create
curl -X POST http://localhost:8181/v1/note \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"Name": "Project Notes",
"Description": "This is the note content...",
"OwnerId": 5,
"NoteTypeId": 1,
"Tags": [1, 2],
"StartDate": "2024-01-15T10:00"
}'
Example - Update
curl -X POST http://localhost:8181/v1/note \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"ID": 123,
"Name": "Updated Title",
"Description": "Updated content..."
}'
An update is partial: fields you leave out keep their stored values, and an absent Tags, Groups or Resources array keeps the existing associations. Send an explicit empty array to clear an association, and an explicit empty value to clear Description, StartDate or EndDate.
Response
{
"ID": 123,
"Name": "Project Notes",
"Description": "This is the note content...",
...
}
Delete Note
Delete a note.
POST /v1/note/delete?Id={id}
Example
curl -X POST "http://localhost:8181/v1/note/delete?Id=123" \
-H "Accept: application/json"
Get Note Meta Keys
Get all unique metadata keys used across notes.
GET /v1/notes/meta/keys
Example
curl http://localhost:8181/v1/notes/meta/keys
Response
Each key is returned as an object with a key field:
[{"key": "attendees"}, {"key": "location"}, {"key": "priority"}, {"key": "status"}]
Inline Editing
Edit note name, description, or a single metadata field with minimal payload.
Edit Name
POST /v1/note/editName?id={id}
Edit Description
POST /v1/note/editDescription?id={id}
Edit Meta
Edit a single metadata field at a dot-notation path using deep merge.
POST /v1/note/editMeta?id={id}
Query Parameters
| Parameter | Description |
|---|---|
id | Required. Note ID |
Form Fields
| Field | Description |
|---|---|
path | Dot-notation path into the Meta field (e.g., attendees.count, location) |
value | JSON-encoded value to set at that path |
Response
{"ok": true, "id": 123, "meta": {"attendees": {"count": 5}, "location": "Room A"}}
Behavior
- Creates intermediate objects as needed
- Preserves sibling fields at every nesting level
- If the path does not exist, it is created
- If an intermediate key holds a scalar, it is overwritten to become an object
- Returns the full updated meta in the response
Errors
- 400: Missing ID, missing path, missing value, invalid JSON, malformed path (empty segments), or corrupt existing meta
- 404: Note not found
Bulk Operations
Bulk operations apply an action to multiple notes at once. Each endpoint accepts a JSON or form-encoded body with ID (repeated) for the note IDs. Most also take EditedId (repeated) for the entity IDs to add or remove; the exceptions are Add Metadata (which takes Meta) and Bulk Delete (which takes only ID).
Add Tags
POST /v1/notes/addTags
| Parameter | Type | Description |
|---|---|---|
ID | integer[] | Note IDs to modify |
EditedId | integer[] | Tag IDs to add |
curl -X POST http://localhost:8181/v1/notes/addTags \
-H "Content-Type: application/json" \
-d '{
"ID": [1, 2, 3],
"EditedId": [10, 11]
}'
Remove Tags
POST /v1/notes/removeTags
| Parameter | Type | Description |
|---|---|---|
ID | integer[] | Note IDs to modify |
EditedId | integer[] | Tag IDs to remove |
curl -X POST http://localhost:8181/v1/notes/removeTags \
-H "Content-Type: application/json" \
-d '{
"ID": [1, 2, 3],
"EditedId": [10]
}'
Add Groups
POST /v1/notes/addGroups
| Parameter | Type | Description |
|---|---|---|
ID | integer[] | Note IDs to modify |
EditedId | integer[] | Group IDs to associate |
curl -X POST http://localhost:8181/v1/notes/addGroups \
-H "Content-Type: application/json" \
-d '{
"ID": [1, 2, 3],
"EditedId": [5]
}'
Add Metadata
POST /v1/notes/addMeta
| Parameter | Type | Description |
|---|---|---|
ID | integer[] | Note IDs to modify |
Meta | string | JSON metadata to merge (as a string) |
curl -X POST http://localhost:8181/v1/notes/addMeta \
-H "Content-Type: application/json" \
-d '{
"ID": [1, 2, 3],
"Meta": "{\"status\": \"reviewed\"}"
}'
Mass Edit
Apply several edits — tags, related groups, related resources, owner and metadata — to many
notes in one transaction. Target an explicit ID list, or set Target=filter with the
list page's raw query string and an ExpectedCount the server re-checks with 409 on
mismatch. Ops: TagsOp/TagIds, GroupsOp/GroupIds (related groups),
ResourcesOp/ResourceIds (related resources), OwnerOp/OwnerId, and
MetaOp/Meta/MetaKeys; DryRun resolves the set and echoes the parsed ops, committing nothing (the far-endpoint and cycle checks run on the real submit).
curl -X POST http://localhost:8181/v1/notes/massEdit \
-H "Content-Type: application/json" \
-d '{"ID": [1, 2], "TagsOp": "replace", "TagIds": [10]}'
The verbs, the all-or-nothing transaction, the typed errors and the response shape are the same as the resources endpoint; notes have no series meta.
Bulk Delete
POST /v1/notes/delete
| Parameter | Type | Description |
|---|---|---|
ID | integer[] | Note IDs to delete |
curl -X POST http://localhost:8181/v1/notes/delete \
-H "Content-Type: application/json" \
-d '{"ID": [1, 2, 3]}'
Note Sharing API
Share notes publicly via a unique token. Shared notes are accessible on the share server without authentication. See the Note Sharing feature docs for details.
Sharing requires a running share server (-share-port / SHARE_PORT). Without one, POST /v1/note/share answers 503 Service Unavailable, and the check runs before the note is looked up. A missing noteId answers 400, and a note that does not exist answers 404.
Share a Note
Generate a public share token for a note.
POST /v1/note/share?noteId={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID to share |
Example
curl -X POST "http://localhost:8181/v1/note/share?noteId=123"
Response
{
"shareToken": "abc123def456ghi789jkl012mno345pq",
"shareUrl": "/s/abc123def456ghi789jkl012mno345pq"
}
The token is 32 characters. If the note is already shared, the existing token is returned.
Unshare a Note
Remove public access from a shared note.
DELETE /v1/note/share?noteId={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID to unshare |
Example
curl -X DELETE "http://localhost:8181/v1/note/share?noteId=123"
Response
{
"success": true
}
Bulk Unshare
Revoke several share tokens at once. Requires the editor role under -auth.
POST /v1/admin/shares/bulk-revoke
Content-Type: application/x-www-form-urlencoded
Form Fields
| Field | Type | Description |
|---|---|---|
ids | integer | The note ID to unshare. Repeat the field once per note. Non-numeric and zero values are skipped |
Example
curl -X POST http://localhost:8181/v1/admin/shares/bulk-revoke \
-H "Accept: application/json" \
-d "ids=123" -d "ids=124"
Response
{
"success": true,
"revoked": 2,
"attempts": 2
}
Without Accept: application/json the request redirects to /admin/shares.
Note Blocks API
Blocks provide a structured editing system for note content. Each block has a type, position, content, and state. Content is what you edit in edit mode. State is what updates while viewing (e.g., checking a todo item). Blocks are ordered by position string, which uses fractional indexing for efficient reordering.
Block Types
Built-in block types:
| Type | Description |
|---|---|
text | Rich text content |
heading | Section heading (level 1-6) |
divider | Horizontal separator line |
gallery | Resource thumbnails in grid or list layout |
references | Linked group cards |
todos | Checklist with items |
table | Data table (manual data or query-based) |
calendar | Calendar view driven by ICS URLs, resources, and custom events |
Plugins can register additional block types with the prefix plugin:<plugin-name>:<type>.
Get Block Types
List all block types with their default content and state.
GET /v1/note/block/types
Query Parameters
| Parameter | Type | Description |
|---|---|---|
noteId | integer | Optional. Adds an allowed flag to every plugin-registered type, saying whether that note may have a block of this type added. A note ID that does not exist answers 404 |
Built-in types never carry allowed, and without noteId the flag is absent everywhere. Plugin-registered types also carry label, icon, description, plugin, pluginName and filters.
Example
curl "http://localhost:8181/v1/note/block/types?noteId=123"
Response
[
{
"type": "text",
"defaultContent": {"text": ""},
"defaultState": {}
},
{
"type": "heading",
"defaultContent": {"text": "", "level": 2},
"defaultState": {}
},
{
"type": "plugin:my-plugin:chart",
"defaultContent": {},
"defaultState": {},
"label": "Chart",
"icon": "chart-bar",
"description": "Renders a chart from a saved query",
"plugin": true,
"pluginName": "my-plugin",
"allowed": true
}
]
List Blocks for a Note
Retrieve all blocks for a specific note, ordered by position.
GET /v1/note/blocks?noteId={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID |
Example
curl "http://localhost:8181/v1/note/blocks?noteId=123"
Response
[
{
"id": 1,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"noteId": 123,
"type": "heading",
"position": "a0",
"content": {"text": "Introduction", "level": 2},
"state": {}
},
{
"id": 2,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"noteId": 123,
"type": "text",
"position": "a1",
"content": {"text": "This is the introduction paragraph..."},
"state": {}
}
]
Get Single Block
Retrieve a specific block by ID.
GET /v1/note/block?id={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | Required. The block ID |
Example
curl "http://localhost:8181/v1/note/block?id=1"
Response
{
"id": 1,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"noteId": 123,
"type": "text",
"position": "a0",
"content": {"text": "Hello world"},
"state": {}
}
Create Block
Create a new block for a note.
POST /v1/note/block
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID |
type | string | Required. Block type (text, heading, etc.) |
position | string | Position string for ordering. When omitted, the block is appended after all existing blocks |
content | object | Initial content (defaults to type's default content) |
Example
curl -X POST http://localhost:8181/v1/note/block \
-H "Content-Type: application/json" \
-d '{
"noteId": 123,
"type": "text",
"position": "a0",
"content": {"text": "My new paragraph"}
}'
Response
Returns the created block with HTTP status 201.
{
"id": 5,
"createdAt": "2024-01-15T12:00:00Z",
"updatedAt": "2024-01-15T12:00:00Z",
"noteId": 123,
"type": "text",
"position": "a0",
"content": {"text": "My new paragraph"},
"state": {}
}
Update Block Content
Update the content of an existing block. Use this in edit mode.
PUT /v1/note/block?id={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | Required. The block ID |
noteId | integer | Optional ownership guard. When present, a block belonging to a different note is refused with 400 |
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
content | object | Required. New content for the block |
Example
curl -X PUT "http://localhost:8181/v1/note/block?id=5" \
-H "Content-Type: application/json" \
-d '{
"content": {"text": "Updated paragraph text"}
}'
Response
Returns the updated block.
{
"id": 5,
"createdAt": "2024-01-15T12:00:00Z",
"updatedAt": "2024-01-15T12:05:00Z",
"noteId": 123,
"type": "text",
"position": "a0",
"content": {"text": "Updated paragraph text"},
"state": {}
}
Update Block State
Update the state of a block. Use this while viewing (e.g., checking a todo item).
PATCH /v1/note/block/state?id={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | Required. The block ID |
noteId | integer | Optional ownership guard. When present, a block belonging to a different note is refused with 400 |
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
state | object | Required. New state for the block |
Example
# Mark a todo item as checked
curl -X PATCH "http://localhost:8181/v1/note/block/state?id=10" \
-H "Content-Type: application/json" \
-d '{
"state": {"checked": ["item-1", "item-2"]}
}'
Response
Returns the updated block.
{
"id": 10,
"createdAt": "2024-01-15T12:00:00Z",
"updatedAt": "2024-01-15T12:10:00Z",
"noteId": 123,
"type": "todos",
"position": "a2",
"content": {"items": [{"id": "item-1", "label": "Task 1"}, {"id": "item-2", "label": "Task 2"}]},
"state": {"checked": ["item-1", "item-2"]}
}
Delete Block
Delete a block.
DELETE /v1/note/block?id={id}
Or using POST (for form compatibility):
POST /v1/note/block/delete?id={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
id | integer | Required. The block ID |
noteId | integer | Optional ownership guard. When present, a block belonging to a different note is refused with 400 |
Example
curl -X DELETE "http://localhost:8181/v1/note/block?id=5"
Response
Returns HTTP status 204 (No Content) on success.
Reorder Blocks
Update positions for multiple blocks in a single request.
POST /v1/note/blocks/reorder
Request Body (JSON)
| Field | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID |
positions | object | Required. Map of block ID to new position string |
Example
curl -X POST http://localhost:8181/v1/note/blocks/reorder \
-H "Content-Type: application/json" \
-d '{
"noteId": 123,
"positions": {
"1": "a0",
"2": "a1",
"3": "a2"
}
}'
Response
Returns HTTP status 204 (No Content) on success.
Rebalance Block Positions
Normalize position strings for all blocks in a note. Useful when position strings have grown too long from repeated insertions.
POST /v1/note/blocks/rebalance?noteId={id}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
noteId | integer | Required. The note ID |
Response
Returns HTTP status 204 (No Content) on success.
Get Table Block Query Data
Execute the query associated with a table block and return the results in table format.
GET /v1/note/block/table/query?blockId={blockId}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
blockId | integer | Required. The table block ID |
Additional query parameters are passed through to the query (merged with the block's stored queryParams).
Example
curl "http://localhost:8181/v1/note/block/table/query?blockId=10"
Response
{
"columns": [{"id": "col_0", "label": "name"}, {"id": "col_1", "label": "value"}],
"rows": [{"id": "row_0", "col_0": "Example", "col_1": 42}],
"cachedAt": "2024-01-15T10:00:00Z",
"queryId": 5,
"isStatic": false
}
Each column's id is its position in the SELECT list and its label is the
name the query gave it. Rows are keyed by those positional ids, plus a synthetic
id the client uses as a list key. Keying by the column name instead would lose a
value whenever a query selects the same name twice (select 10 as dup, 20 as dup)
or selects a column actually called id, which the synthetic key would overwrite.
A cell holding a JSON document (any json/jsonb column) arrives as its compact
JSON text, because both renderers of this response produce one text node per
cell. POST /v1/query/run returns the same cell as structure.
Get Calendar Block Events
Get events for a calendar block within a date range.
GET /v1/note/block/calendar/events?blockId={blockId}&start={date}&end={date}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
blockId | integer | Required. The calendar block ID |
start | string | Required. Start date (YYYY-MM-DD) |
end | string | Required. End date (YYYY-MM-DD) |
Example
curl "http://localhost:8181/v1/note/block/calendar/events?blockId=15&start=2024-01-01&end=2024-01-31"
Block Type Schemas
Each block type has its own content and state schema.
Text Block
Content:
{
"text": "The text content"
}
State: Empty object {}
Heading Block
Content:
{
"text": "Heading text",
"level": 2
}
level: Integer 1-6 (corresponds to h1-h6)
State: Empty object {}
Divider Block
Content: Empty object {}
State: Empty object {}
Gallery Block
Content:
{
"resourceIds": [1, 2, 3]
}
resourceIds: Array of resource IDs to display
State:
{
"layout": "grid"
}
layout: Either"grid"or"list"
References Block
Content:
{
"groupIds": [10, 20, 30]
}
groupIds: Array of group IDs to display as references (required, can be empty)
State: Empty object {}
Todos Block
Content:
{
"items": [
{"id": "item-1", "label": "First task"},
{"id": "item-2", "label": "Second task"}
]
}
items: Array of todo items, each with uniqueidandlabel
State:
{
"checked": ["item-1"]
}
checked: Array of item IDs that are checked
Table Block
A table block holds either static data (columns/rows) or a query reference (queryId). It cannot have both.
Content (query-driven):
{
"queryId": 5,
"queryParams": {"minSize": "1000000"},
"isStatic": false
}
queryId: ID of a saved Query to executequeryParams: Named parameters to pass to the QueryisStatic: Optional flag, only valid whenqueryIdis set (eithertrueorfalseis accepted)
Content (static data):
{
"columns": [{"id": "name", "label": "Name"}, {"id": "value", "label": "Value"}],
"rows": [{"name": "Example", "value": 42}]
}
columns: Array of column definitions (strings or objects withid/label)rows: Array of row objects keyed by column IDs
State:
{
"sortColumn": "Name",
"sortDirection": "asc"
}
sortDirection: Either"asc"or"desc"
Calendar Block
Content:
{
"calendars": [
{
"id": "work",
"name": "Work Calendar",
"color": "#3b82f6",
"source": {"type": "url", "url": "https://example.com/calendar.ics"}
},
{
"id": "local",
"name": "Stored Calendar",
"color": "#10b981",
"source": {"type": "resource", "resourceId": 42}
}
]
}
calendars: Array of calendar sources. Each entry has anid,name, optionalcolor(hex), and asourceobject withtype("url"or"resource") plus the correspondingurlorresourceIdfield.
State:
{
"view": "month",
"currentDate": "2024-06-15",
"customEvents": [
{
"id": "evt1",
"title": "Team Meeting",
"start": "2024-06-20T10:00:00Z",
"end": "2024-06-20T11:00:00Z",
"allDay": false,
"calendarId": "custom"
}
]
}
view:"month"or"agenda"currentDate: ISO date string for the current view positioncustomEvents: User-created events (max 500 per block, each withcalendarIdset to"custom", plus optionallocationanddescription)
Limitations:
- ICS responses are cached with a 30-minute TTL
- Maximum ICS file size: 10 MB
- No RRULE (recurring event) support -- only the first occurrence of recurring events is shown
- A
urlsource must use http or https, because the server fetches it - An event whose well-formed RFC 3339
endprecedes itsstartis rejected
Note Types API
Note types define templates and display customizations for notes.
List Note Types
Retrieve all note types.
GET /v1/note/noteTypes
Query Parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
Name | string | Filter by name |
Description | string | Filter by description |
Example
curl http://localhost:8181/v1/note/noteTypes
Response
[
{
"ID": 1,
"Name": "Meeting",
"Description": "Meeting notes template",
"CustomHeader": "<h2>{{ note.Name }}</h2>",
"CustomSidebar": "...",
"CustomSummary": "...",
"CustomAvatar": "..."
}
]
Create Note Type
Create a new note type.
POST /v1/note/noteType
Parameters
| Parameter | Type | Description |
|---|---|---|
Name | string | Note type name |
Description | string | Description |
CustomHeader | string | Custom header template |
CustomSidebar | string | Custom sidebar template |
CustomSummary | string | Custom summary template |
CustomAvatar | string | Custom avatar template |
CustomListHeader | string | Custom list-page header template |
CustomDetailFooter | string | Template rendered at the bottom of the detail page |
CustomListFooter | string | Custom list-page footer template (carrier-bound, like CustomListHeader) |
CustomHoverCard | string | Hover-card template; falls back to CustomSummary when empty |
ApplyTemplatesToShares | boolean | Apply this note type's CustomHeader and CustomCSS to shared-note pages |
CustomMRQLResult | string | Custom MRQL result-card template |
CustomCSS | string | Custom CSS injected on note type pages |
MetaSchema | string | JSON schema for metadata validation |
SectionConfig | string | JSON section layout configuration |
Example
curl -X POST http://localhost:8181/v1/note/noteType \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"Name": "Task",
"Description": "Task tracking notes",
"CustomHeader": "<div class=\"task-header\">{{ note.Name }}</div>"
}'
Edit Note Type
Update an existing note type.
POST /v1/note/noteType/edit
Parameters
Same as create, but include the ID field to identify which note type to update.
Example
curl -X POST http://localhost:8181/v1/note/noteType/edit \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"ID": 1,
"Name": "Meeting Notes",
"Description": "Updated description"
}'
Delete Note Type
Delete a note type.
POST /v1/note/noteType/delete?Id={id}
Example
curl -X POST "http://localhost:8181/v1/note/noteType/delete?Id=1" \
-H "Accept: application/json"
Inline Editing for Note Types
Edit Name
POST /v1/noteType/editName?id={id}
Edit Description
POST /v1/noteType/editDescription?id={id}