Activities
Track interactions — notes, calls, emails, meetings, and tasks
Activities log interactions and tasks related to your contacts, companies, and deals. Use them to build a timeline of every touchpoint.
Data Model
| Field | Type | Description |
|---|---|---|
id | string | Unique ID with act_ prefix |
type | string | Activity type (see below) |
subject | string | null | Brief summary |
body | string | null | Detailed content |
contact_id | string | null | Associated contact (ct_ prefix) |
company_id | string | null | Associated company (co_ prefix) |
deal_id | string | null | Associated deal (dl_ prefix) |
owner_id | string | null | Who owns this activity |
is_done | boolean | Whether the activity is completed |
due_date | string | null | When the activity is due (ISO 8601) |
completed_at | string | null | When it was completed (ISO 8601) |
metadata | object | Flexible key-value metadata |
tags | string[] | Tags for categorization |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 8601 timestamp |
Activity Types
| Type | Description |
|---|---|
note | General note or comment |
task | Action item with optional due date |
email | Email record |
call | Phone call log |
meeting | Meeting record |
custom | Custom activity type |
Create an Activity
curl -X POST https://api.nodestash.io/v1/activities \
-H "Authorization: Bearer $NODESTASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "task",
"subject": "Follow up on proposal",
"body": "Send revised pricing after Q2 discussion",
"contact_id": "ct_abc123",
"deal_id": "dl_def456",
"due_date": "2026-03-05T14:00:00Z",
"tags": ["follow-up"]
}'const activity = await client.activities.create({
type: 'task',
subject: 'Follow up on proposal',
body: 'Send revised pricing after Q2 discussion',
contact_id: 'ct_abc123',
deal_id: 'dl_def456',
due_date: '2026-03-05T14:00:00Z',
tags: ['follow-up'],
})Log a Call with Metadata
Use the metadata field to store structured data specific to the activity type:
curl -X POST https://api.nodestash.io/v1/activities \
-H "Authorization: Bearer $NODESTASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "call",
"subject": "Discovery call with Acme",
"body": "Discussed their current CRM pain points",
"contact_id": "ct_abc123",
"is_done": true,
"completed_at": "2026-02-20T15:30:00Z",
"metadata": {
"duration_seconds": 1800,
"direction": "outbound",
"recording_url": "https://calls.example.com/rec_123"
}
}'const call = await client.activities.create({
type: 'call',
subject: 'Discovery call with Acme',
body: 'Discussed their current CRM pain points',
contact_id: 'ct_abc123',
is_done: true,
completed_at: '2026-02-20T15:30:00Z',
metadata: {
duration_seconds: 1800,
direction: 'outbound',
recording_url: 'https://calls.example.com/rec_123',
},
})Mark as Done
curl -X PATCH https://api.nodestash.io/v1/activities/act_abc123 \
-H "Authorization: Bearer $NODESTASH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_done": true
}'await client.activities.update('act_abc123', { is_done: true })Filter Activities
# Open tasks for a contact
curl "https://api.nodestash.io/v1/activities?type=task&is_done=false&contact_id=ct_abc123" \
-H "Authorization: Bearer $NODESTASH_API_KEY"
# All activities for a deal
curl "https://api.nodestash.io/v1/activities?deal_id=dl_def456&sort=-created_at" \
-H "Authorization: Bearer $NODESTASH_API_KEY"// Open tasks for a contact
const { data: tasks } = await client.activities.list({
type: 'task',
is_done: 'false',
contact_id: 'ct_abc123',
})
// All activities for a deal
for await (const activity of client.activities.listAll({
deal_id: 'dl_def456',
sort: '-created_at',
})) {
console.log(`[${activity.type}] ${activity.subject}`)
}Available Filters
| Parameter | Match Type | Description |
|---|---|---|
type | Exact | Filter by activity type |
contact_id | Exact | Filter by contact |
company_id | Exact | Filter by company |
deal_id | Exact | Filter by deal |
is_done | Exact | true or false |
Activities require the activities:read scope for GET requests and activities:write for create/update/delete.