Read bulk-operations/SKILL.md first — JSONL piping, batch read, and jq reshape patterns (resources/json-patterns.md) apply. hubspot activities list --help is the source of truth.
Output shape
activities list returns one flat row per activity, sorted newest-first: {id, type, timestamp, lastModified, title, body, status, owner_id}. timestamp and lastModified are ISO 8601; type is CALL|EMAIL|NOTE|MEETING|TASK. Different from the raw hs_call_* / hs_timestamp (Unix ms) on the underlying objects — fetch those with hubspot objects get --type calls if needed.
For point-in-time filtering compare lastModified (hs_lastmodifieddate, when the body was last edited), not timestamp (engagement creation time) — otherwise you include content edited after your cutoff.
All activity for a record
Pass exactly one of --contact, --deal, --company, --ticket (or --type <object_type> --record <id> for any other object type). Use --activity-type CALL|EMAIL|NOTE|MEETING|TASK to filter by activity kind, --limit N for the most recent N. Note --type is now the object-type flag, not the activity-kind filter:
Client-side date filter
ISO 8601 strings compare lexicographically.
Compact timeline
Pre-call brief
Four piped commands: contact + company + open deals + activity. Use batch objects get over stdin — never xargs -I{} (see bulk-operations/SKILL.md).
Transcripts
Fetch the transcript for a single call or meeting by its activity ID (from hubspot activities list). Defaults to CALL; pass --activity-type MEETING for a meeting, and --fields to limit which enrichment fields are fetched:
Dump all call transcripts to a file:
Output shape: {"transcriptId":"...","activityId":...,"transcriptSource":"...","transcriptStatus":"READY","numUtterances":3,"recordingUrl":"...","aiSummary":"...","transcriptionProvider":null,"utterances":[...],"createdAt":"...","updatedAt":"..."}. transcriptStatus, numUtterances, recordingUrl, aiSummary, and transcriptionProvider are the five enrichment fields — present only on enriched transcripts, and --fields limits which are fetched. The utterances array holds the speech content; empty if no transcript was recorded or uploaded.
Deleting a transcript is irreversible: hubspot activities transcript delete <id> --dry-run first, then re-run with --digest/--confirm (confirm the target name from the preview line).
Constraints
--limitdefaults to 100 and there is no--aftercursor — long histories can't be paged.bodycan be long; use the compact timeline for skimming.

