Team Collaboration
Thread Notes & Assignment
Leave internal notes on email threads (invisible to external senders), @mention teammates to create tasks on their agenda, and assign threads to other inboxes in the same tenant. Requires startup+ plan.
Auth: Agent token or session auth. Token calls require email:read for listing notes and email:write for creating, deleting notes and assigning threads. Session callers pass inbox_id.
Mentions: mentions is a list of teammate email addresses. Each mentioned teammate receives a task on their agenda referencing the thread. The author is automatically excluded. Unknown or cross-tenant addresses are rejected with 400.
Retention: Thread notes auto-expire after 90 days.
Events & agenda: Thread assignments and @mention tasks have no due date — they appear at the top of GET /v1/agenda/ as "pending": true items, before any dated items. Subscribe an event notification to thread.assigned or add it to webhook_events to get push notification when a thread is assigned to your inbox. Contact handoffs fire contact.handoff_received and also create a pending task.
GET
/v1/messages/threads/{thread_id}/notes/
List internal notes on a thread scope: email:read
200 OK
[{
"note_id": "<note-id>",
"author_inbox_id": "<inbox-id>",
"body": "This contact needs a follow-up call by EOW",
"mentions": ["alice@example.com"],
"created_at": "2024-01-01T00:00:00Z"
}]
POST
/v1/messages/threads/{thread_id}/notes/
Add a note to a thread scope: email:write
Request body
{
"body": "@alice@example.com review this before replying",
"mentions": ["alice@example.com"]
}
| Field | Type | Required | Description |
| body | string | required | — |
| mentions | array | optional | Email addresses of teammates to notify. |
201 Created — the note record
DELETE
/v1/messages/threads/{thread_id}/notes/{note_id}/
Delete a note scope: email:write
Only the note author may delete their own note. Returns 204 No Content.
POST
/v1/messages/threads/{thread_id}/assign/
Assign a thread to a teammate scope: email:write
Request body
{
"to": "alice@example.com",
"note": "Needs legal review"
}
| Field | Type | Required | Description |
| to | string | required | Team member email, same tenant. |
| note | string | optional | Added to task description. |
200 OK
{ "assigned": true, "to": "alice@example.com" }
Creates a [Assigned] {subject} task on the assignee's agenda. Both must be in the same tenant. Use GET /v1/inboxes/ to discover teammate email addresses.
Team Collaboration
Email Templates
Tenant-level email templates shared across all team members. Admins (tenant owner) create and manage templates; all members can list, retrieve, and render them. Templates support {placeholder} substitution with POST /v1/templates/{template_id}/. Requires startup+ plan.
GET
/v1/templates/
List all templates for the tenant
200 OK
[{
"template_id": "<template-id>",
"name": "Follow-up",
"subject": "Following up on {topic}",
"body": "Hi {first_name},\n\nJust following up...",
"variables": ["first_name", "topic"],
"created_by": "<user-id>",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-01T00:00:00Z"
}]
POST
/v1/templates/
Create a template (admin only)
Request body
{
"name": "Follow-up",
"subject": "Following up on {topic}",
"body": "Hi {first_name}, just following up",
"variables": ["first_name", "topic"]
}
| Field | Type | Required | Description |
| name | string | optional | — |
| subject | string | optional | — |
| body | string | optional | — |
| variables | array | optional | Declared placeholders. |
201 Created — the template record
PATCH
/v1/templates/{template_id}/
Update a template (admin only)
Request body — all fields optional
{
"name": "Updated name",
"subject": "New subject",
"body": "New body",
"variables": ["first_name"]
}
DELETE
/v1/templates/{template_id}/
Delete a template (admin only) — 204 No Content
POST
/v1/templates/{template_id}/
Render a template with variable substitution
Request body
{
"context": { "first_name": "Alice", "topic": "your proposal" }
}
200 OK
{
"subject": "Following up on your proposal",
"body": "Hi Alice, just following up"
}
Missing context keys are left as literal {placeholder} — no error is raised.
Team Collaboration
Distribution Lists
Shared email addresses (e.g. support@company.com) that fan out incoming mail to multiple team member inboxes. Each member inbox receives a copy of all messages sent to the list address. Requires team governance controls (governance: token_controls or higher). Tenant admin only for mutations.
GET
/v1/distribution-lists/
List all distribution lists for the tenant
200 OK
[{
"list_id": "<list-id>",
"address": "support@company.com",
"name": "Support Team",
"created_by": "<user-id>",
"created_at": "2024-01-01T00:00:00Z"
}]
POST
/v1/distribution-lists/
Create a distribution list (admin only)
Request body
{
"address": "support@company.com",
"name": "Support Team"
}
| Field | Type | Required | Description |
| address | string | required | Must be a verified domain. |
| name | string | required | — |
201 Created — the list record
PATCH
/v1/distribution-lists/{list_id}/
Rename a list (admin only)
{ "name": "New name" }
DELETE
/v1/distribution-lists/{list_id}/
Delete a list and remove all aliases (admin only) — 204 No Content
GET
/v1/distribution-lists/{list_id}/members/
List members
[{
"member_id": "<member-id>",
"inbox_id": "<inbox-id>",
"inbox_address": "alice@company.com",
"added_at": "2024-01-01T00:00:00Z"
}]
POST
/v1/distribution-lists/{list_id}/members/
Add a member inbox (admin only)
Request body
{ "inbox_id": "<inbox-id>" }
Idempotent — adding an already-member inbox returns the existing record. Adding a member registers the list address as an alias on the inbox; mail to the list address is delivered to the member's Inbox folder.
DELETE
/v1/distribution-lists/{list_id}/members/{inbox_id}/
Remove a member (admin only) — 204 No Content