nodestash

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

FieldTypeDescription
idstringUnique ID with act_ prefix
typestringActivity type (see below)
subjectstring | nullBrief summary
bodystring | nullDetailed content
contact_idstring | nullAssociated contact (ct_ prefix)
company_idstring | nullAssociated company (co_ prefix)
deal_idstring | nullAssociated deal (dl_ prefix)
owner_idstring | nullWho owns this activity
is_donebooleanWhether the activity is completed
due_datestring | nullWhen the activity is due (ISO 8601)
completed_atstring | nullWhen it was completed (ISO 8601)
metadataobjectFlexible key-value metadata
tagsstring[]Tags for categorization
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp

Activity Types

TypeDescription
noteGeneral note or comment
taskAction item with optional due date
emailEmail record
callPhone call log
meetingMeeting record
customCustom 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

ParameterMatch TypeDescription
typeExactFilter by activity type
contact_idExactFilter by contact
company_idExactFilter by company
deal_idExactFilter by deal
is_doneExacttrue or false

Activities require the activities:read scope for GET requests and activities:write for create/update/delete.

API Reference

On this page