Semarize

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

Call transcript text (full conversation transcript with speaker attribution)
Speaker identification (rep vs. prospect labelling)
Call metadata (date, time, duration, call type, participants)
Tracker mentions (Chorus-native keyword and topic tracking results)
Deal intelligence signals (Chorus’s built-in deal analysis metadata)
Engagement metrics (talk ratio, longest monologue, question count)
Call recordings (audio file access via URL)
CRM association (linked Salesforce/HubSpot opportunity data)
Team and user context (which rep, team, and manager hierarchy)
Custom tag data (user-applied tags and categories)

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.

1

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/json
Chorus is now part of ZoomInfo. API access may require a ZoomInfo Sales package or legacy Chorus plan with API enabled. Contact your account team to confirm API availability.
2

List 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.

3

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}/transcript

Each 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.

4

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

1

Obtain API credentials from the Chorus admin panel (Settings → API)

2

List calls by date range using GET /api/v1/calls with startDate and endDate parameters. Paginate through all results using offset and limit

3

For each call ID, fetch the transcript via GET /api/v1/calls/{callId}/transcript

4

Parse the structured transcript into your desired format - plain text, speaker-attributed segments, or structured JSON

5

Send the parsed transcripts to Semarize for analysis, or load directly into your data warehouse

Tip: Process in batches of 50\u2013100 calls. Chorus's API can be slower for large date ranges.

Incremental Polling

Ongoing extraction on a schedule

1

Schedule a job (cron, cloud function, or automation tool) to run at your desired frequency - hourly works well for most teams

2

On each run, list calls from the last N hours using GET /api/v1/calls with appropriate date parameters

3

Filter returned call IDs against your store of already-processed IDs to avoid reprocessing

4

Fetch transcripts for new calls and route them to Semarize for structured analysis

5

Update your processed call ID store and timestamp for the next polling cycle

Tip: Use a persistent store for processed call IDs. Chorus doesn't provide a "modified since" filter, so deduplication is on you.

Event-Driven (via CRM Trigger)

React to Chorus data landing in your CRM

1

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

2

When the CRM trigger fires, extract the call ID or Chorus reference from the CRM record

3

Fetch the full transcript from the Chorus API using GET /api/v1/calls/{callId}/transcript

4

Process the transcript via Semarize and route the structured output back to your CRM or downstream systems

Note: This pattern works well when Chorus is integrated with your CRM. It avoids polling the Chorus API directly and leverages your existing CRM automation infrastructure.

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.

ZapierNo-code automation

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.

Example Zap
Schedule: Every Hour
Triggers the Zap on a schedule
App: Schedule by Zapier
Event: Every Hour
Webhooks by Zapier
List recent calls from Chorus API
Method: GET
URL: https://chorus.ai/api/v1/calls?startDate=...
Auth: Bearer {api_token}
Webhooks by Zapier
Fetch transcript from Chorus API
Method: GET
URL: https://chorus.ai/api/v1/calls/{{call_id}}/transcript
Auth: Bearer {api_token}
Transcript returned
Webhooks by Zapier
POST /v1/runs (sync) to Semarize
Method: POST
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Structured output returned
Formatter by Zapier
Extract brick values from Semarize response
Extract: bricks.overall_score.value
Extract: bricks.risk_flag.value
Extract: bricks.pain_point.value
Salesforce - Update Record
Write scored signals to Opportunity
Object: Opportunity
AI Score: {{overall_score}}
Risk Flag: {{risk_flag}}
Pain Point: {{pain_point}}

Setup steps

1

Create a new Zap. Choose "Schedule by Zapier" as the trigger and set the interval to every hour.

2

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.

3

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.

4

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.

5

Add a Formatter step to extract individual brick values from the Semarize JSON response - overall_score, risk_flag, pain_point, etc.

6

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.

Watch out for: Chorus doesn't have a native Zapier integration. You'll need to use Webhooks by Zapier for all API calls. Zapier has step data size limits that can truncate very long transcripts - for calls over 60 minutes, consider storing the transcript externally.
Learn more about Zapier automation
n8nSelf-hosted workflows

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.

Example Workflow
Cron - Every Hour
Triggers the workflow on schedule
Mode: Every Hour
Timezone: UTC
HTTP Request - List Calls
GET /api/v1/calls (Chorus)
Method: GET
URL: https://chorus.ai/api/v1/calls
Auth: Bearer
Params: startDate={{$now.minus(1, 'hour')}}&endDate={{$now}}
For each call ID
HTTP Request - Fetch Transcript
GET /api/v1/calls/{callId}/transcript (Chorus)
URL: https://chorus.ai/api/v1/calls/{{$json.id}}/transcript
Code - Format Transcript
Concatenate utterances into plain text
Join: utterances by speaker
HTTP Request - Semarize
POST /v1/runs (sync)
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Scores & signals returned
Postgres - Insert Row
Write structured output to database
Table: call_evaluations
Columns: call_id, score, risk_flag, pain_point

Setup steps

1

Add a Cron node as the workflow trigger. Set the interval to your desired polling frequency (hourly works well for most teams).

2

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.

3

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.

4

Add a Code node (JavaScript) to format the transcript utterances into a single transcript string. Join each utterance's text, prefixed by speaker name.

5

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.

6

Add a Code node to extract the brick values from the Semarize response - overall_score, risk_flag, pain_point, evidence, confidence.

7

Add a Postgres (or MySQL / HTTP Request) node to write the structured output. Use call_id as the primary key for upserts.

8

Activate the workflow. Monitor the first few runs to verify Semarize responses are arriving and writing correctly.

Watch out for: No native n8n node for Chorus. Use HTTP Request nodes with Bearer token auth for all calls. Use call IDs as deduplication keys to prevent reprocessing.
Learn more about n8n automation
MakeVisual automation with branching

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.

Example Scenario
Schedule - Every 30 min
Triggers the scenario on interval
Interval: 30 minutes
HTTP - List Recent Calls
GET /api/v1/calls (Chorus)
Method: GET
Auth: Bearer
Params: startDate={{formatDate(...)}}&endDate={{now}}
HTTP - Fetch Transcript
GET /api/v1/calls/{callId}/transcript (Chorus)
Iterator: for each call in response
URL: https://chorus.ai/api/v1/calls/{{item.id}}/transcript
HTTP - Semarize
POST /v1/runs (sync)
URL: https://api.semarize.com/v1/runs
Auth: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript } }
Structured output
Router - Branch on Risk Flag
Route by Semarize output
Branch 1: IF risk_flag.value = true
Branch 2: ALL (fallthrough)
Branch 1 - Risk detected
Slack - Alert Channel
Notify team about flagged call
Channel: #deal-alerts
Message: Risk on {{call_id}}, score: {{score}}
Branch 2 - All calls
Salesforce - Update Record
Write all scored signals to Opportunity
AI Score: {{overall_score}}
Risk Flag: {{risk_flag}}
Pain Point: {{pain_point}}

Setup steps

1

Create a new Scenario. Add a Schedule module as the trigger, set to your desired interval (15–60 minutes is typical).

2

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.

3

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.

4

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.

5

Add a Router module. Define Branch 1 with a filter: bricks.risk_flag.value equals true. Leave Branch 2 as a fallthrough (no filter).

6

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.

7

On Branch 2, add a Salesforce module to write all brick values (score, risk_flag, pain_point) to the Opportunity record.

8

Set the scenario schedule and activate. Monitor the first few runs in Make’s execution log.

Watch out for: Track the offset parameter between runs to handle pagination correctly. Each API call counts as an operation, so a scenario processing 50 calls uses ~200 operations (list + transcript + Semarize per call, plus routing).
Learn more about Make automation

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

framework_adherence = 0.76steps_followed = 4deviation = "skipped_budget_qual"framework = "internal_spiced_v3"

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 Coaching
Framework Adherence

Grounded against: SPICED v3 Playbook

1. Situation identified
2. Pain articulated
3. Impact quantified
4. Critical event established - skipped
5. Decision process mapped
6. Economic buyer confirmed - skipped

4 of 6 steps followed · 67% adherence

Budget qualification skipped in 60% of discovery calls

Battlecard Accuracy Verification

Competitive intel, verified

What Semarize generates

claims_accurate = 0.83outdated_claim = truebattlecard_used = truecompetitor = "competitor_x"

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
Battlecard Accuracy Report - Jan 2026
CompetitorClaimsAccurateOutdatedAction
Competitor A1210 (83%)2Update battlecard
Competitor B88 (100%)0Up to date
Competitor C53 (60%)2Urgent update

25 competitive claims checked · 84% accuracy · 4 outdated claims detected

Cross-Platform Signal Aggregation

One framework, every platform

What Semarize generates

total_signals = 12chorus_signals = 5zoom_signals = 4teams_signals = 3

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 RevOps
Deal Signal Coverage - Acme Corp
5
4
3
Chorus: 5
Zoom: 4
Teams: 3
= 12 total
Budget confirmedChorus call, Jan 15
Technical fit validatedZoom demo, Jan 20
Legal concerns raisedTeams review, Jan 22
Champion identifiedChorus call, Jan 18
Security review neededZoom demo, Jan 20

5 of 7 qualification signals present · 2 require follow-up

Custom Enablement Dashboard

Certification on your terms

Vibe-coded

What Semarize generates

rep_readiness = 0.71calls_until_certified = 3weak_areas = "discovery"improvement_rate = 0.15

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 Coaching
Rep Certification TrackerVibe-coded with Next.js
Sarah K.
92%Certified
James M.
71%3 calls to go
Priya R.
48%Needs coaching
Tom W.
85%1 call to go

Skill breakdown - James M.

Discovery65
Objections80
Closing68

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

Explore Semarize