Get Your Data
Chorus - How to Get Your Conversation Data
A practical guide to getting your conversation data from Chorus (now part of ZoomInfo) - covering API access, data export options, and how to route structured data into downstream systems.
What you'll learn
- What conversation data you can extract from Chorus - call transcripts, trackers, deal intelligence, and engagement metrics
- How to access data via the Chorus API - authentication, key endpoints, and pagination
- Three extraction patterns: historical export, scheduled polling, and event-driven flows
- How to connect Chorus data pipelines to Zapier, n8n, and Make
- Advanced use cases - custom scoring, CRM enrichment, compliance, and warehouse analytics
Data
What Data You Can Extract From Chorus
Chorus captures more than just the recording. Every call produces a set of structured assets that can be extracted via API - the transcript itself, speaker identification, tracker mentions, deal intelligence signals, and contextual information about the call and its associated deal.
Common fields teams care about
API Access
How to Get Transcripts via the Chorus API
Chorus exposes calls and transcripts through a REST API. The workflow is: authenticate with an API token, list calls by date range, then fetch the transcript for each call ID.
Authenticate
Chorus uses API token-based authentication. Generate an API token in the Chorus admin settings (Settings → API) and pass it as a Bearer token in the Authorization header on every request.
Authorization: Bearer {api_token}
Content-Type: application/jsonList calls by date range
Call the GET /api/v1/calls endpoint with startDate and endDate query parameters. Results are paginated - useoffset and limit parameters to page through results.
GET https://chorus.ai/api/v1/calls?startDate=2026-01-01&endDate=2026-01-31
The response returns a paginated list of call objects with metadata. Each call includes id, date, participants, and duration. Keep paginating using offset and limit until all results are returned.
Fetch the transcript
For each call ID, request the transcript via GET /api/v1/calls/{callId}/transcript. The response contains a structured transcript with speaker-labeled utterances, timestamps, speaker names, and utterance text.
GET https://chorus.ai/api/v1/calls/{callId}/transcriptEach utterance in the transcript includes speaker, timestamp, and text. Reassemble into plain text by concatenating utterances, or preserve the structured format for per-speaker analysis.
Handle access and limitations
Plan-dependent access
API access depends on your Chorus/ZoomInfo plan. Not all plans include API access. Check with your account team before building integrations to confirm your plan supports programmatic data extraction.
Rate limits
Chorus may impose rate limits on API requests. Implement standard retry logic with exponential backoff. For bulk operations, pace requests conservatively and persist your pagination offset between runs.
Patterns
Key Extraction Flows
There are three practical patterns for getting transcripts out of Chorus. The right choice depends on whether you're doing a one-off migration, running ongoing extraction, or leveraging CRM integration for event-driven processing.
Backfill (Historical Export)
One-off migration of past calls
Obtain API credentials from the Chorus admin panel (Settings → API)
List calls by date range using GET /api/v1/calls with startDate and endDate parameters. Paginate through all results using offset and limit
For each call ID, fetch the transcript via GET /api/v1/calls/{callId}/transcript
Parse the structured transcript into your desired format - plain text, speaker-attributed segments, or structured JSON
Send the parsed transcripts to Semarize for analysis, or load directly into your data warehouse
Incremental Polling
Ongoing extraction on a schedule
Schedule a job (cron, cloud function, or automation tool) to run at your desired frequency - hourly works well for most teams
On each run, list calls from the last N hours using GET /api/v1/calls with appropriate date parameters
Filter returned call IDs against your store of already-processed IDs to avoid reprocessing
Fetch transcripts for new calls and route them to Semarize for structured analysis
Update your processed call ID store and timestamp for the next polling cycle
Event-Driven (via CRM Trigger)
React to Chorus data landing in your CRM
Since Chorus syncs data to your CRM (Salesforce/HubSpot), configure a CRM webhook or automation trigger that fires when Chorus writes new call data to a record
When the CRM trigger fires, extract the call ID or Chorus reference from the CRM record
Fetch the full transcript from the Chorus API using GET /api/v1/calls/{callId}/transcript
Process the transcript via Semarize and route the structured output back to your CRM or downstream systems
Automation
Send Chorus Transcripts to Automation Tools
Once you can extract transcripts from Chorus, the next step is routing them through Semarize for structured analysis and into your downstream systems. Below are end-to-end example flows - each showing the full pipeline from Chorus trigger through Semarize evaluation to CRM, Slack, or database output.
Chorus → Zapier → Semarize → CRM
Poll Chorus for recent calls on a schedule, fetch the transcript, send it to Semarize for structured analysis, then write the scored output - signals, flags, and evidence - directly to your CRM.
Setup steps
Create a new Zap. Choose "Schedule by Zapier" as the trigger and set the interval to every hour.
Add a "Webhooks by Zapier" Action (Custom Request) to list recent calls from Chorus. Set method to GET, URL to https://chorus.ai/api/v1/calls with date parameters, and add your Bearer token auth header.
Add a second "Webhooks by Zapier" Action to fetch the transcript. Set method to GET, URL to https://chorus.ai/api/v1/calls/{{call_id}}/transcript, with the same Bearer token auth.
Add a third "Webhooks by Zapier" Action. Set method to POST, URL to https://api.semarize.com/v1/runs. Add your Semarize API key as a Bearer token. In the body, set kit_code to your Kit, mode to "sync", and map the transcript text into input.transcript.
Add a Formatter step to extract individual brick values from the Semarize JSON response - overall_score, risk_flag, pain_point, etc.
Add a Salesforce (or HubSpot, Sheets, etc.) Action to write the extracted scores and signals to your CRM record. Test each step end-to-end, then turn on the Zap.
Chorus → n8n → Semarize → Database
Poll Chorus for new calls on a schedule, fetch transcripts, send each one to Semarize for analysis, then write the structured scores and signals to your database. n8n's native loop support handles pagination and batch processing.
Setup steps
Add a Cron node as the workflow trigger. Set the interval to your desired polling frequency (hourly works well for most teams).
Add an HTTP Request node to list new calls from Chorus. Set method to GET, URL to https://chorus.ai/api/v1/calls, configure Bearer token auth, and add startDate/endDate query parameters for the last interval.
Add a Split In Batches node to iterate over the returned call IDs. Inside the loop, add an HTTP Request node to fetch each transcript via GET /api/v1/calls/{callId}/transcript.
Add a Code node (JavaScript) to format the transcript utterances into a single transcript string. Join each utterance's text, prefixed by speaker name.
Add another HTTP Request node to send the transcript to Semarize. Set method to POST, URL to https://api.semarize.com/v1/runs. Add your API key as a Bearer token. Set kit_code, mode to "sync", and map the transcript into input.transcript.
Add a Code node to extract the brick values from the Semarize response - overall_score, risk_flag, pain_point, evidence, confidence.
Add a Postgres (or MySQL / HTTP Request) node to write the structured output. Use call_id as the primary key for upserts.
Activate the workflow. Monitor the first few runs to verify Semarize responses are arriving and writing correctly.
Chorus → Make → Semarize → CRM + Slack
Fetch new Chorus transcripts on a schedule, send each to Semarize for structured analysis, then use a Router to branch the scored output - alert on risk flags via Slack and write all signals to your CRM.
Setup steps
Create a new Scenario. Add a Schedule module as the trigger, set to your desired interval (15–60 minutes is typical).
Add an HTTP module to list recent calls from Chorus. Set method to GET, URL to https://chorus.ai/api/v1/calls, configure Bearer token auth, and add date range parameters.
Add an Iterator module to loop through each call. For each, add an HTTP module to fetch the transcript via GET /api/v1/calls/{callId}/transcript.
Add another HTTP module to send the transcript to Semarize. Set URL to https://api.semarize.com/v1/runs, add your Bearer token, and set kit_code, mode to "sync", and input.transcript from the previous step. Parse the response as JSON.
Add a Router module. Define Branch 1 with a filter: bricks.risk_flag.value equals true. Leave Branch 2 as a fallthrough (no filter).
On Branch 1, add a Slack module to alert your team when risk is detected. Map the score, risk flag, and call ID into the message.
On Branch 2, add a Salesforce module to write all brick values (score, risk_flag, pain_point) to the Opportunity record.
Set the scenario schedule and activate. Monitor the first few runs in Make’s execution log.
What you can build
What You Can Do With Chorus Data in Semarize
Custom scoring frameworks, cross-platform intelligence, battlecard verification, and building your own enablement tools on structured conversation data.
Custom Framework Scoring
Your Framework, Fully Scored
What Semarize generates
Your VP of Sales has a custom qualification framework — a modified SPICED with company-specific stages — that doesn’t exist in any vendor’s system. Semarize evaluates every call against YOUR framework document, checking whether reps followed each step in order, which steps were skipped, and why. The weekly adherence report shows exactly where the process breaks down — scored against your specific methodology, updated whenever the framework changes.
Learn more about Sales CoachingGrounded against: SPICED v3 Playbook
4 of 6 steps followed · 67% adherence
Budget qualification skipped in 60% of discovery calls
Battlecard Accuracy Verification
Competitive intel, verified
What Semarize generates
Your reps mention competitors on calls every day — but are they saying the right things? Semarize runs a battlecard accuracy kit grounded against your competitive intelligence documents. When a rep claims “they don’t support SOC 2,” Semarize checks your latest battlecard — and flags it as outdated because the competitor achieved SOC 2 certification last month. Your CI team gets a weekly report of which battlecards need updating based on real rep conversations.
Learn more about Sales Coaching| Competitor | Claims | Accurate | Outdated | Action |
|---|---|---|---|---|
| Competitor A | 12 | 10 (83%) | 2 | Update battlecard |
| Competitor B | 8 | 8 (100%) | 0 | Up to date |
| Competitor C | 5 | 3 (60%) | 2 | Urgent update |
25 competitive claims checked · 84% accuracy · 4 outdated claims detected
Cross-Platform Signal Aggregation
One framework, every platform
What Semarize generates
Your team runs sales calls on one platform, demos on Zoom, and internal deal reviews on Teams. A deal’s qualification signals are spread across multiple platforms with no way to score them consistently. Semarize ingests transcripts from all sources and scores them with one consistent framework. The unified signal count tells you whether a deal has been properly qualified across ALL touchpoints — giving you the full picture from every conversation source. Deals that look green on one platform might be red when you see the complete view.
Learn more about RevOps5 of 7 qualification signals present · 2 require follow-up
Custom Enablement Dashboard
Certification on your terms
What Semarize generates
An enablement director vibe-codes a certification dashboard that tracks whether new reps meet your company’s “call-ready” criteria. Semarize scores every call against your enablement rubric — tailored to your company’s specific methodology and standards — and the dashboard shows each rep’s progression toward certification. Red means not ready, amber means close, green means certified. Reps can see exactly what skills they need to demonstrate before handling enterprise deals independently.
Learn more about Sales CoachingSkill breakdown - James M.
Grounded against: Enablement Rubric v2.1 · 156 calls scored
Watch out for
Common Challenges & Gotchas
These are the issues that come up most often when teams start extracting transcripts from Chorus at scale.
API access tied to plan tier
Not all Chorus/ZoomInfo plans include API access. Verify with your account team before building.
ZoomInfo acquisition changes
Chorus was acquired by ZoomInfo. API endpoints, authentication, and feature availability may change as integration progresses.
No native webhook support
Chorus doesn’t offer outbound webhooks. Rely on polling or CRM-triggered workflows.
Limited filtering options
The API may not support granular filtering (e.g., by team, call type). Filter results client-side.
Tracker data is Chorus-specific
Chorus’s built-in trackers and deal signals are proprietary. They may not map cleanly to your own scoring framework.
Rate limits underdocumented
Chorus’s API rate limits may not be clearly documented. Start conservatively and adjust.
Speaker labelling depends on CRM sync
Accurate rep vs. prospect labelling relies on Chorus’s CRM integration being properly configured.
FAQ
Frequently Asked Questions
Explore