Semarize

Get Your Data

Zoom Revenue Accelerator - How to Get Your Conversation Data

A practical guide to getting your conversation data out of Zoom Revenue Accelerator - covering OAuth authentication, REST API endpoints, historical backfill, incremental polling, webhook-triggered flows, and how to route structured data into your downstream systems.

What you'll learn

  • What conversation data you can extract from ZRA - transcripts, interactions, CRM context, and deal metadata
  • How to access data via the Zoom Developer Platform - OAuth 2.0, key endpoints, and rate limit tiers
  • Three extraction patterns: historical backfill, incremental polling, and webhook-triggered
  • How to connect ZRA data pipelines to Zapier, n8n, and Make
  • Advanced use cases - stage validation, cross-platform scoring, forecast grounding, and enablement analytics

Data

What Data You Can Extract From ZRA

Zoom Revenue Accelerator captures conversation intelligence from every Zoom meeting where ZRA is enabled. Every conversation produces structured data that can be extracted via the Zoom Developer Platform API - transcripts, interaction details, CRM context, and deal-level metadata.

Common fields teams care about

Full transcript text (via interactions endpoint)
Speaker labels (host, participant, external)
Conversation owner / rep name
Associated account and deal name
Deal stage and CRM record context
Meeting date, time, and duration
Participant list and email addresses
Conversation comments and annotations
Engagement and sentiment signals
CRM data: accounts, contacts, deals, leads

API Access

How to Get Transcripts via the ZRA API

ZRA exposes conversation data through the Zoom Developer Platform REST API. The workflow is: authenticate with OAuth 2.0, list conversations, then fetch the transcript for each conversation ID via the interactions endpoint.

1

Authenticate with OAuth 2.0

ZRA uses OAuth 2.0 via the Zoom Developer Platform. For automated pipelines, use Server-to-Server OAuth - create an app in the Zoom Marketplace, obtain your account_id, client_id, and client_secret, then exchange them for an access token.

POST https://zoom.us/oauth/token
  ?grant_type=account_credentials
  &account_id=<account_id>

Authorization: Basic Base64(<client_id>:<client_secret>)
Content-Type: application/x-www-form-urlencoded
Your app needs the revenue_accelerator:read:admin scope (or equivalent ZRA scopes). Access tokens expire after 1 hour - implement automatic refresh in your integration. You must have an active ZRA add-on license on your Zoom account.
2

List conversations by date range

Call the GET /iq/conversations endpoint with from and to query parameters. Results are paginated - use the next_page_token to fetch subsequent pages.

GET https://api.zoom.us/v2/iq/conversations
  ?from=2025-01-01
  &to=2025-02-01
  &page_size=50
  &next_page_token=

Authorization: Bearer <access_token>

The response returns an array of conversation objects with conversation_id, start_time, duration, participants, and associated deal context. Keep paginating until next_page_token is empty.

3

Fetch the transcript

For each conversation ID, request the transcript via GET /zra/conversations/{id}/interactions. The response contains interaction data with speaker attribution and timestamped utterances.

GET https://api.zoom.us/v2/zra/conversations/abc123/interactions

Authorization: Bearer <access_token>

Each interaction in the response includes speaker, timestamp, and text fields. Reassemble into plain text by concatenating utterances, or preserve the structured format for per-speaker analysis. You can also fetch conversation comments via GET /iq/conversations/{id}/comments.

4

Handle rate limits and transcript availability

Rate limits

ZRA uses Zoom's tiered rate limiting: LIGHT, MEDIUM, and HEAVY categories. Each endpoint is classified into a tier. When you receive a 429 response, back off using the Retry-After header. Check x-ratelimit-limit and x-ratelimit-remaining headers to pace requests.

Transcript timing

Transcripts are not available the instant a Zoom meeting ends. ZRA processes recordings asynchronously - typical lag is minutes to hours depending on call length and system load. Build a buffer into your extraction timing or use webhooks to trigger fetches when processing completes.

Patterns

Key Extraction Flows

There are three practical patterns for getting transcripts out of Zoom Revenue Accelerator. The right choice depends on whether you're doing a one-off migration, running ongoing extraction, or need near real-time processing.

Backfill (Historical Export)

One-off migration of past conversations

1

Define your date range - typically 6–12 months of historical conversations, or all available data if migrating

2

Call GET /iq/conversations with from and to date parameters. Paginate through the full result set using next_page_token, collecting all conversation IDs

3

For each conversation ID, fetch the transcript via GET /zra/conversations/{id}/interactions. Pace requests to stay within your rate limit tier

4

Store each transcript with its conversation metadata (conversation ID, date, participants, deal context) in your data warehouse or object store

5

Once the backfill completes, run your analysis pipeline against the stored data in bulk

Tip: Persist your next_page_token between batches. If the process is interrupted, you can resume from where you left off instead of re-scanning from the start.

Incremental Polling

Ongoing extraction on a schedule

1

Set a cron job or scheduled trigger (hourly, daily, etc.) that runs your extraction script

2

On each run, call GET /iq/conversations with the from parameter set to your last successful poll timestamp

3

Fetch transcripts for any new conversation IDs returned via the interactions endpoint. Use the conversation ID as a deduplication key to avoid reprocessing

4

Route each transcript and its metadata to your downstream pipeline - analysis tool, warehouse, or automation platform

5

Update your stored cursor / timestamp to the current run time for the next poll cycle

Tip: Account for transcript processing delay. A conversation that ended 10 minutes ago may not have a transcript yet. Polling with a 1\u20132 hour lag reduces empty fetches.

Webhook-Triggered

Near real-time on conversation completion

1

Register a webhook endpoint in your Zoom Marketplace app. ZRA fires events when a conversation is processed and the transcript becomes available

2

When the webhook fires, parse the event payload to extract the conversation ID and metadata

3

Immediately fetch the transcript via GET /zra/conversations/{id}/interactions using the conversation ID from the event

4

Route the transcript and metadata downstream - to your analysis pipeline, CRM updater, or automation tool

Note: Zoom webhooks require endpoint validation - your endpoint must respond to a challenge request during registration. Ensure your webhook URL is publicly accessible and handles the validation handshake.

Automation

Send ZRA Transcripts to Automation Tools

Once you can extract transcripts from Zoom Revenue Accelerator, 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 ZRA trigger through Semarize evaluation to CRM, Slack, or database output.

ZapierNo-code automation

ZRA → Zapier → Semarize → CRM

Detect new ZRA conversations via webhook, 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
Trigger: Webhook from ZRA
Fires when ZRA processes a new conversation
App: Webhooks by Zapier
Event: Catch Hook
Output: conversation_id, participants
Webhooks by Zapier
Fetch transcript from ZRA API
Method: GET
URL: https://api.zoom.us/v2/zra/conversations/{{id}}/interactions
Auth: Bearer (OAuth 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. Use "Webhooks by Zapier" as the trigger (Catch Hook). Register the webhook URL in your Zoom Marketplace app to fire on conversation completion events.

2

Add a "Webhooks by Zapier" Action (Custom Request) to fetch the transcript from ZRA. Set method to GET, URL to https://api.zoom.us/v2/zra/conversations/{{id}}/interactions, and add your OAuth Bearer token.

3

Add a second "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.

4

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

5

Add a Salesforce (or HubSpot, Sheets, etc.) Action to write the extracted scores and signals to your CRM record.

6

Test each step end-to-end, then turn on the Zap.

Watch out for: OAuth tokens expire every hour. For Zapier, consider using a middleware (like a custom Zapier app or a proxy) that handles token refresh automatically. Zapier's built-in Zoom integration may not cover ZRA-specific endpoints - use Custom Request steps instead. Use mode: "sync" so Semarize returns results inline.
Learn more about Zapier automation
n8nSelf-hosted workflows

ZRA → n8n → Semarize → Database

Poll ZRA for new conversations 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, and its credential store manages OAuth token refresh automatically.

Example Workflow
Cron - Every Hour
Triggers the workflow on schedule
Mode: Every Hour
Timezone: UTC
HTTP Request - List Conversations
GET /iq/conversations (ZRA)
Method: GET
URL: https://api.zoom.us/v2/iq/conversations
Auth: OAuth 2.0
Params: { from: {{$now.minus(1, 'hour')}}, page_size: 50 }
For each conversation ID
HTTP Request - Fetch Transcript
GET /zra/conversations/{id}/interactions
URL: https://api.zoom.us/v2/zra/conversations/{{$json.id}}/interactions
Code - Reassemble Transcript
Concatenate utterances into plain text
Join: interactions[].text 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: conversation_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 conversations from ZRA. Set method to GET, URL to https://api.zoom.us/v2/iq/conversations, configure OAuth 2.0 credentials, and set the from parameter to one interval ago.

3

Add a Split In Batches node to iterate over the returned conversation IDs. Inside the loop, add an HTTP Request node to fetch each transcript via GET /zra/conversations/{id}/interactions.

4

Add a Code node (JavaScript) to reassemble the interactions array 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 conversation_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: n8n's OAuth 2.0 credential type handles token refresh natively - configure it with your Zoom app's client ID, client secret, and token URLs. Use conversation IDs as deduplication keys to prevent reprocessing. You can also use async mode with n8n's native loop - POST /v1/runs (default async), then poll GET /v1/runs/:runId with a Wait + IF loop until status is "succeeded".
Learn more about n8n automation
MakeVisual automation with branching

ZRA → Make → Semarize → CRM + Slack

Fetch new ZRA 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 New Conversations
GET /iq/conversations (ZRA)
Method: GET
Auth: OAuth 2.0
Params: { from: {{formatDate(...)}}, page_size: 50 }
HTTP - Fetch Transcript
GET /zra/conversations/{id}/interactions
Iterator: for each conversation in response
URL: .../zra/conversations/{{item.id}}/interactions
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 conversation
Channel: #deal-alerts
Message: Risk on {{conversation_id}}, score: {{score}}
Branch 2 - All conversations
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 new conversations from ZRA. Set method to GET, URL to https://api.zoom.us/v2/iq/conversations, configure OAuth 2.0 auth, and filter by from date since the last run.

3

Add an Iterator module to loop through each conversation. For each, add an HTTP module to fetch the transcript via GET /zra/conversations/{id}/interactions.

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 conversation 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: Make's built-in Zoom module may not cover ZRA-specific endpoints. Use the generic HTTP module with OAuth 2.0 for ZRA calls. Each API call counts as an operation. A scenario processing 50 conversations uses ~150 operations (list + transcript + Semarize per conversation). Use mode: "sync" to avoid needing a polling loop for each run.
Learn more about Make automation

What you can build

What You Can Do With ZRA Data in Semarize

Custom stage validation, cross-platform scoring, conversation-grounded forecasting, and building your own analytics on structured conversation signals. Here's what you can build.

Technical Requirements Extraction from Calls

Structured Pre-Sales Intelligence

What Semarize generates

integration_requirement = "salesforce_api"security_concern = "sso_mandatory"deployment_preference = "on_prem"requirements_completeness = 0.65

Technical requirements buried in sales conversations get lost between discovery and handoff to solutions engineering. Run every call through a requirements extraction kit. Semarize returns integration_requirement, security_concern, deployment_preference, and data_residency_constraint as typed fields from each conversation. Solutions engineers get a structured brief before the first technical call instead of watching 45 minutes of recording. Scoping accuracy improves because requirements come from what the prospect actually said, not the AE’s summary.

Learn more about RevOps
Stage Gate Validation200 deals scored
Stage 1pain_identified94%
Stage 2budget_range_discussed78%
Stage 3decision_process_mapped65%~
Stage 4procurement_timeline_confirmed69%
Blocked: Acme Corp ($120k) — Stage 4 missing procurement_timeline_confirmed
31% of Stage 4 deals missing required Bricks · Pipeline accuracy +28%

Zoom-Native vs External Call Comparison

Cross-Platform Scoring

What Semarize generates

zoom_discovery = 72phone_discovery = 63zoom_competitive = 58phone_competitive = 63

Your team runs some calls through Zoom, others through Teams, and others over the phone. Cross-platform comparison reveals insights you can’t get from a single source. Pull transcripts from every platform and run everything through the same Semarize qualification kit. The analysis reveals that Zoom calls have 15% higher discovery_depth than phone calls but 8% lower competitive_positioning. Video creates better rapport (higher discovery) but reps forget to differentiate (lower competitive positioning) — possibly because they rely on screen sharing instead of verbal positioning. The insight emerges when every call is scored on the same framework.

Learn more about Data Science
Cross-Platform Conversation QualitySame Kit, 3 sources
Zoom (ZRA)
discovery
72
competitive
58
objection
68
closing
71
Phone
discovery
63
competitive
63
objection
61
closing
65
Teams
discovery
66
competitive
60
objection
64
closing
62
Zoom leads discovery (+15%) but trails competitive positioning (-8%)

Customer Onboarding Playbook Adherence

Knowledge-Grounded CS Verification

What Semarize generates

setup_steps_covered = 6/9incorrect_guidance_given = truecustomer_confusion_detected = trueplaybook_section_skipped = "data_migration"

Your customer onboarding calls are recorded, but nobody checks whether CSMs actually followed the onboarding playbook. Run a knowledge-grounded kit against your 15-page onboarding guide on every CS call. Semarize checks whether each setup step was covered, flags incorrect configuration guidance against the current documentation, and detects customer confusion signals. After scoring 100 onboarding calls, CS leadership discovers that the data migration section gets skipped in 67% of calls — and those accounts have 3x higher support tickets in month 2. The playbook gets restructured around the steps CSMs actually skip.

Learn more about Customer Success
Forecast Adjustment ReviewQ1 FY26
Acme Corp$180k
CommitBest Case
buying_temperature0.28
champion_activity0 days
Globex Inc$140k
CommitBest Case
buying_temperature0.22
champion_activity0 days
Initech Ltd$100k
CommitBest Case
buying_temperature0.31
champion_activity0 days
Total revenue moved: $420k from Commit to Best Case

Custom Sales Enablement Analytics

Training Impact Measurement

Vibe-coded

What Semarize generates

training_impact = +34%workshop_correlation = 0.62auto_enrollment_trigger = "score < 50"programs_evaluated = 8

An enablement manager vibe-codes a Retool dashboard that ingests Semarize scores from every ZRA conversation. This dashboard correlates conversation quality signals with enablement program participation. Reps who completed the "Enterprise Discovery" training have 34% higher discovery_depth scores than those who haven't. Reps who attended objection handling workshops but still score below 50 get auto-enrolled in the advanced session. Enablement investment decisions become data-driven: which programs actually change conversation behaviour, and which are just checkbox activities?

Learn more about Sales Coaching
Training Impact DashboardVibe-coded with Retool
Enterprise Discovery+34%
Pre52
Post70
Rate78%
Objection Handling+27%
Pre48
Post61
Rate65%
Value Selling+9%
Pre55
Post60
Rate82%
Closing Techniques+3%
Pre61
Post63
Rate45%
Auto-enrolling 12 reps with objection scores < 50 into advanced session

Watch out for

Common Challenges & Gotchas

These are the issues that come up most often when teams start extracting transcripts from Zoom Revenue Accelerator at scale.

OAuth token lifecycle management

ZRA uses OAuth 2.0 with expiring access tokens. Your integration must handle token refresh automatically - a stale token silently fails requests. For Server-to-Server OAuth, tokens expire after one hour.

ZRA add-on license required

The ZRA API endpoints are only accessible with an active Zoom Revenue Accelerator subscription. Standard Zoom API credentials won't work against /iq/ or /zra/ endpoints. Verify your account's ZRA provisioning before building integrations.

Tiered rate limits

ZRA uses Zoom's LIGHT/MEDIUM/HEAVY tiered rate limiting. Different endpoints have different limits, and exceeding them returns 429 errors. Check x-ratelimit-limit and x-ratelimit-remaining headers and implement per-tier backoff.

Transcript processing delay

Transcripts are not available immediately after a Zoom meeting ends. ZRA processes recordings asynchronously - attempting to fetch a transcript too soon returns empty data. Use webhooks or build in a retry buffer.

Pagination across large datasets

Conversation listing endpoints return paginated results. Track your pagination token carefully - losing position mid-backfill means re-scanning from the start or risking missed records.

Zoom-only conversation coverage

ZRA only captures conversations that happen on Zoom. Calls on other platforms (Teams, phone, Google Meet) are invisible to ZRA. Plan for multi-source ingestion if your team uses multiple communication tools.

Duplicate processing protection

Without idempotency checks, re-running an extraction flow can process the same conversation twice. Use conversation IDs as deduplication keys to ensure each transcript is handled exactly once.

FAQ

Frequently Asked Questions

Explore

Explore Semarize