/clients/{clientId}/notesCreate a note on a clientRecords a note against the client and returns it as an activity of type: "note". Unlike the generic activity create, the note path attributes the note to a user author (added as a participant contact) and marks the client's AI cards stale so they regenerate.
Author attribution. With a user-scoped key the note is authored by the authenticated user automatically. With a service-scoped key (which carries no user) you MUST supply authorUserId referencing a member of your organization — otherwise the request is rejected with 400 invalid_argument. A cross-organization or unknown authorUserId is likewise 400 invalid_argument.
content is required. participants are people present on the note besides the author; each is linked to (or created as) an org contact by email. occurredAt defaults to now when omitted.
Parameters
clientIdstring · uuidpathrequiredClient UUID.
Request body
requiredapplication/json
Request body for creating a note (`POST /clients/{clientId}/notes`). The note is stored as an activity of type "note". Only `content` is required. `content` is capped at 50,000 characters and `subject` at 500; exceeding either is rejected with `400 invalid_argument` (never a 500).
authorUserIdstring · uuidUser to attribute the note to. Required for service-scoped keys (which carry no user); optional for user-scoped keys, where it defaults to the authenticated user. Must be a member of your organization.
contentstringrequiredThe note body (plain text), stored as the note's single message. Up to 50,000 characters; a longer body is rejected with `400 invalid_argument`.
occurredAtstring · date-timeThe instant the note refers to. Defaults to now when omitted.
participantsarray of objectPeople present on the note besides the author; each is linked to (or created as) an org contact by email.
Show child attributes
Show array items
emailstring · emailrequirednamestringOptional display name for the participant.
subjectnull | stringOptional short subject/title for the note. Up to 500 characters; a longer subject is rejected with `400 invalid_argument`.
{
"authorUserId": "00000000-0000-0000-0000-000000000000",
"content": "string",
"occurredAt": "2026-06-09T00:00:00Z",
"participants": [
{
"email": "user@example.com",
"name": "string"
}
],
"subject": "string"
}Responses
Headers
X-RateLimit-LimitThe request cap for the tighter of the per-organization / per-endpoint windows that applied to this request.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix timestamp (seconds) when the current window resets.
allOf · 2 options
datavaluerequiredThe response payload — shape depends on the endpoint.
metaobjectrequiredPagination metadata — populated on list endpoints, empty on single-resource endpoints.
Show child attributes
cursornull | stringOpaque cursor to pass to the next request.
hasMoreboolean | nullTrue when further pages of results are available.
dataobjectA communication event linked to a client. Projected from Salfio's Conversation + messages + conversation_clients model family. The `clientId` is the "primary" client derived from the junction table — a conversation linked to multiple clients is surfaced once per linked client (from the list endpoints of each). `content` is the full concatenated body of all messages on the conversation, joined by `\n\n---\n\n` — single-resource GETs never truncate it. It is returned only on single-resource GETs; list endpoints omit it for response-size reasons. Webhook delivery payloads cap `content` at 10 KiB (with a `[content truncated at 10 KiB]` marker) — fetch the activity by ID when you need the full text. `immutable` is derived server-side: non-`manual` sources are always immutable on the v1 surface (per the spec source/operation matrix).
Show child attributes
archivedAtnull | string · date-timeclientIdstring · uuidrequiredcontentstringrequiredFull concatenated message bodies (single-resource GETs only; capped at 10 KiB in webhook deliveries).
createdAtstring · date-timerequiredidstring · uuidrequiredimmutablebooleanrequiredTrue when the activity's source prevents it from being edited or hard-deleted via the API.
occurredAtstring · date-timerequiredparticipantsarray of string · emailrequiredShow child attributes
sourcestringrequiredsubjectnull | stringtypestringrequiredupdatedAtstring · date-timerequired{
"data": {
"archivedAt": "2026-06-09T00:00:00Z",
"clientId": "00000000-0000-0000-0000-000000000000",
"content": "string",
"createdAt": "2026-06-09T00:00:00Z",
"id": "00000000-0000-0000-0000-000000000000",
"immutable": true,
"occurredAt": "2026-06-09T00:00:00Z",
"participants": [
"user@example.com"
],
"source": "fireflies",
"subject": "string",
"type": "chat",
"updatedAt": "2026-06-09T00:00:00Z"
},
"meta": {
"cursor": "string",
"hasMore": true
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "invalid_argument",
"message": "limit must be an integer between 1 and 100"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "unauthorized",
"message": "Authentication required"
}
}errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "not_found",
"message": "client not found"
}
}Headers
Retry-AfterSeconds the client should wait before retrying.
errorobjectrequiredShow child attributes
codestringrequiredMachine-readable error category.
detailsobjectOptional per-code context (field names, retry windows, …).
messagestringrequiredHuman-readable description — intended for operator logs, not end-user display.
{
"error": {
"code": "rate_limited",
"details": {
"retry_after_seconds": 30
},
"message": "Rate limit exceeded"
}
}