Notes
Notes are timestamped text entries that can be attached to various entities in Snapbooks, such as business partners, assets, projects, and more. Notes are immutable - once created, they cannot be modified or deleted. To update or remove a note, create a new note (potentially with empty content).
This immutable design ensures a complete audit trail of all notes and changes over time.
Endpoints
List Notes
GET /api/v2/notes
Retrieves a paginated list of notes.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | No | Filter notes by client account |
| relation_type | string | No | Filter by entity type (see Allowed Relation Types) |
| relation_id | integer | No | Filter by specific entity ID |
| is_internal | boolean | No | Filter by internal flag (system vs user notes) |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 50, max: 100) |
| with | string | No | Include related resources (supported: created_by, updated_by) |
Response
{
"data": [
{
"id": 123,
"client_account_id": 456,
"relation_type": "businesspartner",
"relation_id": 789,
"content": "Discussed payment terms for Q4",
"active_from": "2024-03-15T10:00:00Z",
"is_internal": false,
"created_at": "2024-03-15T09:55:00Z",
"created_by_id": 12,
"updated_at": "2024-03-15T09:55:00Z",
"updated_by_id": 12
},
{
"id": 124,
"client_account_id": 456,
"relation_type": "asset",
"relation_id": 234,
"content": "Maintenance required",
"active_from": "2024-03-20T08:00:00Z",
"is_internal": true,
"created_at": "2024-03-15T10:30:00Z",
"created_by_id": 1,
"updated_at": "2024-03-15T10:30:00Z",
"updated_by_id": 1
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 50,
"records": 2
}
}
Get Note
GET /api/v2/notes/{id}
Retrieves a specific note by ID.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| with | string | No | Include related resources (supported: created_by, updated_by) |
Response
{
"id": 123,
"client_account_id": 456,
"relation_type": "businesspartner",
"relation_id": 789,
"content": "Discussed payment terms for Q4",
"active_from": "2024-03-15T10:00:00Z",
"is_internal": false,
"created_at": "2024-03-15T09:55:00Z",
"created_by_id": 12,
"updated_at": "2024-03-15T09:55:00Z",
"updated_by_id": 12
}
Create Note
POST /api/v2/notes
Creates a new note. This is the only way to add notes - notes cannot be updated or deleted once created.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | The ID of the client account |
| relation_type | string | Yes | The type of entity (see Allowed Relation Types) |
| relation_id | integer | Yes | The ID of the entity |
| content | string | Yes | The note content (can be empty string) |
| active_from | datetime | Yes | When the note becomes active (ISO 8601 format) |
| is_internal | boolean | No | Whether this is a system-generated note (default: false) |
Example Request
{
"client_account_id": 456,
"relation_type": "businesspartner",
"relation_id": 789,
"content": "Follow up on contract renewal",
"active_from": "2024-03-20T09:00:00Z",
"is_internal": false
}
Response
{
"id": 125,
"client_account_id": 456,
"relation_type": "businesspartner",
"relation_id": 789,
"content": "Follow up on contract renewal",
"active_from": "2024-03-20T09:00:00Z",
"is_internal": false,
"created_at": "2024-03-15T11:00:00Z",
"created_by_id": 12,
"updated_at": "2024-03-15T11:00:00Z",
"updated_by_id": 12
}
Allowed Relation Types
Notes can only be attached to the following entity types:
| Relation Type | ObjectType Value | Description |
|---|---|---|
| Business Partner | businesspartner |
Customers, suppliers, and other business contacts |
| Bank Account | bankacc |
Company bank accounts |
| Asset | asset |
Fixed assets and equipment |
| Project | project |
Business projects |
| Department | department |
Organizational departments |
| Client Account | CLIENT_ACCOUNT |
The client account itself |
Validation: The system validates that:
- The
relation_typeis one of the allowed types above - The entity with the given
relation_idexists - The entity belongs to the specified
client_account_id
Attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique ID of the note |
| client_account_id | integer | The ID of the client account |
| relation_type | string | The type of entity this note is attached to |
| relation_id | integer | The ID of the entity |
| content | string | The note text (can be empty) |
| active_from | datetime | When the note becomes active |
| is_internal | boolean | Whether this is a system-generated note |
| created_at | datetime | When the note was created |
| created_by_id | integer | The ID of the user who created the note |
| updated_at | datetime | When the note was last updated (typically same as created_at) |
| updated_by_id | integer | The ID of the user who last updated the note |
Immutability Pattern
Notes are immutable - they cannot be modified or deleted after creation. To maintain history:
To “Update” a Note
Create a new note with the updated content and a new active_from timestamp:
{
"relation_type": "businesspartner",
"relation_id": 789,
"content": "Updated: Contract renewed for 2 years",
"active_from": "2024-03-16T14:00:00Z"
}
To “Delete” a Note
Create a new note with empty content:
{
"relation_type": "businesspartner",
"relation_id": 789,
"content": "",
"active_from": "2024-03-17T10:00:00Z"
}
Viewing History
Retrieve all notes for an entity to see the complete history:
GET /api/v2/notes?relation_type=businesspartner&relation_id=789
The response will be ordered by active_from (most recent first), showing the evolution of notes over time.
User vs System Notes
User Notes (is_internal: false)
- Created by users through the UI or API
- Visible to all users with access to the entity
- Used for manual documentation and communication
System Notes (is_internal: true)
- Generated automatically by the system
- Document system actions and automated processes
- Provide audit trails for automated operations
- Still visible in the API (not hidden)
Scheduled Notes
The active_from field allows scheduling notes for future activation:
{
"content": "Reminder: Annual review due",
"active_from": "2024-12-01T00:00:00Z"
}
This can be used for:
- Scheduled reminders
- Future-dated documentation
- Time-based annotations
Error Responses
| Status Code | Description |
|---|---|
| 400 | Bad request (missing required fields) |
| 403 | Forbidden (no access to client account) |
| 404 | Note not found |
| 422 | Validation error (invalid relation_type, entity not found, or ownership mismatch) |
Example Validation Error
{
"error": "Related BusinessPartner does not belong to this client account",
"status": 422
}
Business Rules
- Immutability: Notes cannot be modified or deleted after creation
- Ownership: The related entity must belong to the specified
client_account_id - Access Control: Users must have access to the client account to manage notes
- Ordering: Notes are returned ordered by
active_fromdescending (most recent first) - Internal Flag: The
is_internalflag cannot be changed after creation - Relation Validation: Only specific entity types can have notes attached
Common Use Cases
- Customer Communications: Track conversations and agreements with business partners
- Asset Maintenance: Document maintenance schedules and service history
- Project Documentation: Record project milestones and decisions
- Audit Trails: System-generated notes for automated actions
- Scheduled Reminders: Future-dated notes for upcoming tasks
- Historical Records: Maintain complete history by creating new notes rather than editing
Best Practices
- Use clear, descriptive content for notes
- Set appropriate
active_fromdates for scheduling - Use empty content to indicate deletion/superseding of previous notes
- Filter by
is_internalto distinguish user vs system notes - Query all notes for an entity to view complete history
- Use consistent formatting for similar types of notes
- Leverage the immutability for compliance and auditing