# Voc Source Calls

> Pull sales and customer calls (transcripts, summaries, participants) from your call recorder into local markdown files. Works with Gong, Fireflies, or any recorder with a transcript API via an adapter. Run this first — every other VoC skill reads what it writes. Trigger on /voc-source-calls, "pull this week's calls", "fetch call transcripts", "sync my call recordings".

- Skill: `aatirar/voc-source-calls` (Agent Skill)
- Install (CLI): `npx skillmds@latest add aatirar/voc-source-calls`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aatirar/voc-source-calls/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: aatirar (https://skillmd.com/u/aatirar)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aatirar/voc-source-calls

---


# /voc-source-calls — Pull Call Transcripts

Wraps `scripts/fetch-calls.js`. The script does the network work; this skill handles argument
resolution, verifies the result, and tells you plainly when the data came back incomplete.

## Requires

| What | Value |
|---|---|
| Env vars | `CALL_PROVIDER`, `CALL_API_KEY`, `CALL_API_SECRET` (provider-dependent), `CALL_API_BASE` |
| Optional | `INTERNAL_EMAIL_DOMAINS` — comma-separated, used to label speakers internal vs external when your provider does not |
| Node | 18+ (uses global `fetch`) |
| Cost | Free. Call-recorder APIs are included in your existing subscription. |

If `.env` is missing or a variable is unset, the script exits with the exact list of what is
missing. Do not try to work around it by asking the user to paste a key into chat — tell them
which variable to set in `.env`.

## Run it

```bash
node scripts/fetch-calls.js --window 7d
```

Other forms:

| Command | Use |
|---|---|
| `--window 30d` | Wider backfill |
| `--from 2026-01-01 --to 2026-01-07` | Exact range |
| `--dry-run` | List what would be pulled, write nothing. **Always do this first on a new setup.** |

Calls already on disk are skipped before any transcript request is spent on them, so re-running
an overlapping window is cheap and safe.

## After the run — verify, do not assume

Read the JSON index at `outputs/calls/index-<to-date>.json` and check three things before
reporting success:

1. **`totalFound` is plausible.** Zero on a week your team was selling means the date filter or
   the credential scope is wrong, not that nothing happened.
2. **`hasSummary` is not `false` for every row.** If it is, the API credential is not requesting
   content fields. This is the single most common failure and it returns `200 OK` the whole way.
3. **`externalParticipants` is not `0` everywhere.** If it is, either the provider does not label
   affiliation, or `INTERNAL_EMAIL_DOMAINS` is unset. Quote attribution depends on this — say so
   rather than letting the next skill silently treat your own reps' words as customer voice.

Report the run as a short table: calls found, filtered as too short, newly written, already on
disk, and any warnings the script printed. If warnings appeared, quote them.

## Adding a provider

`scripts/providers/README.md` documents the adapter interface. It is four functions. The Gong
adapter is tested against a live account; the Fireflies one is written to the published schema
but unverified, and the generic one is a template. Say which you are using when you report.

## Operational notes

- The markdown index is for humans. **Parse the JSON index, never the markdown table** — call
  titles containing a literal `|` corrupt the table silently, and a corrupted row looks exactly
  like a call that did not happen.
- Transcripts are customer conversations. They are personal data under GDPR and CCPA. Check
  where `VOC_OUTPUT_DIR` points before running: a synced Dropbox or iCloud folder means every
  transcript leaves your machine. Default it to a local, git-ignored path.
- This skill only fetches. Classification and analysis live in `/voc-analyze-calls`.

