Semarize

Get Your Data

Otter.ai - How to Get Your Conversation Data

A practical guide to getting your conversation data out of Otter.ai - covering REST API access, OAuth authentication, transcript retrieval, meeting summaries, Zapier integration, and how to route structured meeting data into your downstream systems.

What you'll learn

  • What conversation data you can extract from Otter.ai - transcripts, summaries, action items, speaker labels, and key topics
  • How to access data via the Otter.ai REST API - OAuth 2.0 authentication, endpoints, and beta access requirements
  • Three extraction patterns: manual export, Zapier-triggered, and API-driven polling
  • How to connect Otter.ai data pipelines to Zapier, n8n, and Make
  • Advanced use cases - meeting efficiency scoring, speaker analytics, action item tracking, and team insight dashboards

Data

What Data You Can Extract From Otter.ai

Otter.ai captures more than just a transcript. Every meeting produces a set of structured assets - the full transcript with speaker labels, AI-generated summaries, extracted action items, key topics, and timing metadata. These can be accessed via the API, Zapier, or manual export.

Common fields teams care about

Full transcript text with timestamps
Speaker identification and labels
AI-generated meeting summary
Extracted action items
Key topics and keywords
Meeting date, time, and duration
Participant list
Audio recording reference
Meeting title and workspace
Export formats (SRT, TXT, PDF)

API Access

How to Get Transcripts via the Otter.ai API

Otter.ai exposes meeting data through a REST API currently in beta. The workflow is: obtain OAuth 2.0 credentials from your account manager, authenticate to get an access token, list meetings, then fetch the transcript and metadata for each meeting ID.

1

Request API access

The Otter.ai API is not publicly self-serve. Contact your Otter.ai account manager to request beta API access. You will receive a client_id and client_secret for OAuth 2.0 authentication once approved.

API access is currently in beta. Approval timelines vary - plan for a provisioning delay before you can start building. Check developer-guides.tryotter.com for the latest documentation and access requirements.
2

Authenticate with OAuth 2.0

Exchange your client credentials for an access token using the OAuth 2.0 client credentials flow. Include the access token as a Bearer token in the Authorization header on every subsequent request.

POST https://api.otter.ai/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<your_client_id>
&client_secret=<your_client_secret>
// Use the returned token on all API requests
Authorization: Bearer <access_token>
Content-Type: application/json
Access tokens expire. Implement automatic token refresh logic - check the expires_in field in the token response and request a new token before expiry to avoid pipeline interruptions.
3

List meetings

Call the meetings endpoint to retrieve a list of meetings in your workspace. Filter by date range and paginate through results using the returned cursor.

GET https://api.otter.ai/v1/meetings?from=2025-01-01T00:00:00Z&to=2025-02-01T00:00:00Z&limit=50

Authorization: Bearer <access_token>

The response returns an array of meeting objects with id, title, created_at, duration, and participants. Keep paginating until no more results are returned.

4

Fetch the transcript and metadata

For each meeting ID, request the full transcript along with summary, action items, and speaker data. The response contains the transcript as an array of utterances with speaker IDs and timestamps.

GET https://api.otter.ai/v1/meetings/<meeting_id>/transcript

Authorization: Bearer <access_token>

Each utterance includes speaker_id, start_time, end_time, and text. The meeting object also provides summary, action_items[], and key_topics[] for lightweight extraction without full transcript processing.

5

Handle rate limits and explore alternatives

Rate limits

The Otter.ai API enforces rate limits that vary based on your access agreement. When you receive a 429 response, back off and retry. For bulk operations, pace requests and persist your pagination cursor between runs. Contact your account manager for specific rate limit details.

Alternative: Zapier

If you don't have API access, Otter.ai's native Zapier integration is a practical alternative. It triggers when a new transcript is ready and provides the transcript text, meeting metadata, and participant information - enough to build an end-to-end pipeline without direct API calls.

Patterns

Key Extraction Flows

There are three practical patterns for getting transcripts out of Otter.ai. The right choice depends on whether you have API access, need a no-code solution, or are doing a one-off export.

Zapier-Triggered (No API Required)

Automatic extraction via native integration

1

Connect your Otter.ai account to Zapier using the native Otter.ai integration. No API credentials required - Zapier handles authentication through OAuth

2

Set up a trigger: "New Transcript in Otter.ai". This fires automatically when any meeting transcript becomes available in your workspace

3

The trigger provides the transcript text, meeting title, duration, date, and participant list. Map these fields to your downstream actions

4

Route the transcript to your analysis pipeline - Semarize for structured scoring, your CRM for meeting logging, or cloud storage for archival

5

For filtering, add a Zapier Filter step to only process meetings matching specific criteria (title contains "sales", duration over 15 minutes, etc.)

Tip: The Zapier integration is the fastest path to automation if you don't have direct API access. Most teams start here and move to the API only when they need bulk historical exports or more granular control.

API Polling (Requires Beta Access)

Scheduled extraction via REST API

1

Obtain API credentials from your Otter.ai account manager. Authenticate via OAuth 2.0 to get an access token

2

Set a cron job or scheduled trigger that runs your extraction script on your desired interval (hourly or daily)

3

On each run, call the meetings endpoint filtered by date range since your last successful poll. Collect all new meeting IDs

4

For each meeting ID, fetch the transcript, summary, action items, and speaker data. Use the meeting ID as a deduplication key

5

Store each transcript with its metadata in your data warehouse or route it to your analysis pipeline for structured processing

Tip: Account for token expiry. Refresh your OAuth access token before each polling run to avoid authentication failures mid-pipeline.

Manual Export

One-off downloads from the Otter.ai UI

1

Open the meeting in the Otter.ai web app or desktop application

2

Click the export/download option from the meeting detail page. Choose your format: TXT for plain text, SRT for subtitles with timestamps, or PDF for formatted documents

3

Download the file and import it into your analysis pipeline manually. Note that manual exports lack structured metadata - no JSON, no speaker IDs as separate fields, no action items array

4

For small volumes (under 10 meetings), this is practical. Beyond that, use the Zapier integration or API for scalable extraction

Note: Manual exports are fine for one-off analysis or proof-of-concept work. For any repeatable pipeline, the Zapier integration or direct API access is required. Manual exports also don't include structured fields like action items or key topics.

Automation

Send Otter.ai Transcripts to Automation Tools

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

ZapierNo-code automation

Otter.ai → Zapier → Semarize → CRM

Detect new Otter.ai transcripts via the native integration, send the transcript to Semarize for structured analysis, then write the scored output - signals, action items, and meeting insights - directly to your CRM or project management tool.

Example Zap
Trigger: New Transcript
Fires when Otter.ai processes a meeting
App: Otter.ai
Event: New Transcript Ready
Output: transcript, title, participants
Transcript available
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.meeting_score.value
Extract: bricks.action_items.value
Extract: bricks.key_decisions.value
HubSpot - Create Note
Write meeting insights to Contact
Object: Contact Activity
Meeting Score: {{meeting_score}}
Action Items: {{action_items}}
Key Decisions: {{key_decisions}}

Setup steps

1

Create a new Zap. Choose Otter.ai as the trigger app and select "New Transcript Ready" as the event. Connect your Otter.ai account via OAuth.

2

Add a "Webhooks by Zapier" Action (Custom Request). 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.

3

Add a Formatter step to extract individual brick values from the Semarize JSON response - meeting_score, action_items, key_decisions, sentiment, etc.

4

Add a HubSpot (or Salesforce, Notion, Sheets, etc.) Action to write the extracted insights to your system of record.

5

Optionally add a Filter step before the Semarize webhook to only process meetings matching criteria (minimum duration, title keywords, specific participants).

6

Test each step end-to-end with a recent Otter.ai transcript, then turn on the Zap.

Watch out for: Zapier has step data size limits that can truncate very long transcripts. For meetings over 60 minutes, consider storing the transcript in cloud storage and passing a reference URL instead of inline text. Use mode: "sync" so Semarize returns results inline - Zapier doesn't natively support polling loops.
Learn more about Zapier automation
n8nSelf-hosted workflows

Otter.ai → n8n → Semarize → Database

Poll the Otter.ai API for new meetings 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
Code - Refresh OAuth Token
Exchange credentials for access token
POST: https://api.otter.ai/oauth/token
grant_type: client_credentials
HTTP Request - List Meetings
GET /v1/meetings (Otter.ai)
Method: GET
URL: https://api.otter.ai/v1/meetings
Auth: Bearer {{access_token}}
Params: from={{$now.minus(1, 'hour')}}
For each meeting ID
HTTP Request - Fetch Transcript
GET /v1/meetings/:id/transcript
URL: .../meetings/{{$json.id}}/transcript
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: meeting_evaluations
Columns: meeting_id, score, action_items, topics

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 a Code node (JavaScript) to handle OAuth token refresh. POST to the Otter.ai token endpoint with your client credentials. Store the access token for use in subsequent nodes.

3

Add an HTTP Request node to list new meetings from Otter.ai. Set method to GET, URL to https://api.otter.ai/v1/meetings, and filter by date range since the last poll.

4

Add a Split In Batches node to iterate over the returned meeting IDs. Inside the loop, add an HTTP Request node to fetch each transcript via GET /v1/meetings/:id/transcript.

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 - meeting_score, action_items, key_decisions, sentiment, evidence.

7

Add a Postgres (or MySQL / HTTP Request) node to write the structured output. Use meeting_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: Use meeting IDs as deduplication keys to prevent reprocessing. Handle OAuth token refresh in the first node of every run - expired tokens are the most common cause of pipeline failures with Otter.ai integrations.
Learn more about n8n automation
MakeVisual automation with branching

Otter.ai → Make → Semarize → CRM + Slack

Poll Otter.ai for new transcripts on a schedule, send each to Semarize for structured analysis, then use a Router to branch the scored output - alert on low meeting scores via Slack and write all insights to your CRM.

Example Scenario
Schedule - Every 30 min
Triggers the scenario on interval
Interval: 30 minutes
HTTP - Refresh Token
POST /oauth/token (Otter.ai)
Method: POST
grant_type: client_credentials
HTTP - List Meetings
GET /v1/meetings (Otter.ai)
Method: GET
Auth: Bearer {{access_token}}
Params: from={{formatDate(...)}}
HTTP - Fetch Transcript
GET /v1/meetings/:id/transcript
Iterator: for each meeting in response
URL: .../meetings/{{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 Score
Route by Semarize output
Branch 1: IF meeting_score.value < 0.5
Branch 2: ALL (fallthrough)
Branch 1 - Low score
Slack - Alert Channel
Notify team about low-value meeting
Channel: #meeting-insights
Message: Low score on {{title}}: {{score}}
Branch 2 - All meetings
HubSpot - Create Note
Write all insights to Contact Activity
Meeting Score: {{meeting_score}}
Key Decisions: {{key_decisions}}
Action Items: {{action_items}}

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 refresh your OAuth access token. POST to https://api.otter.ai/oauth/token with your client credentials. Store the token for subsequent modules.

3

Add an HTTP module to list new meetings from Otter.ai. Set method to GET, URL to https://api.otter.ai/v1/meetings, pass the Bearer token, and filter by date range since the last run.

4

Add an Iterator module to loop through each meeting. For each, add an HTTP module to fetch the transcript via GET /v1/meetings/:id/transcript.

5

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.

6

Add a Router module. Define Branch 1 with a filter: bricks.meeting_score.value less than 0.5. Leave Branch 2 as a fallthrough (no filter).

7

On Branch 1, add a Slack module to alert your team when meeting quality is low. Map the score, title, and action items into the message.

8

On Branch 2, add a HubSpot module to write all brick values (meeting_score, key_decisions, action_items) to the Contact Activity.

9

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

Watch out for: Each API call counts as an operation. A scenario processing 20 meetings uses ~80 operations (token + list + transcript + Semarize per meeting). The OAuth token refresh step is required in Make scenarios since tokens are not persisted between runs. 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 Otter.ai Data in Semarize

Custom scoring frameworks, cross-meeting analytics, follow-through tracking, and building your own tools on structured meeting intelligence signals.

Knowledge-Grounded Consulting Framework Scoring

Delivery Methodology Verification

What Semarize generates

methodology_adherence = 0.72client_participation = 0.45actionable_density = 3.1/hrscope_creep_detected = true

Your consulting firm records client workshops and strategy sessions. Partners need to know whether consultants are delivering against the engagement methodology — not just talking. Run every session transcript through a knowledge-grounded kit against your delivery methodology framework and the client’s SOW. Semarize scores methodology_adherence (did the consultant follow the prescribed framework?), client_participation (are clients contributing or is it a monologue?), actionable_output_density (concrete recommendations per hour), and scope_creep_detection (did discussion drift beyond the SOW?). After scoring 50 engagements, the data shows that sessions with methodology adherence above 0.75 produce 2.3x more actionable outputs — and clients rate those engagements 40% higher in post-project surveys.

Learn more about QA & Compliance
Client Health Timeline - Acme Corp4-week trend
+0.7
Week 1
+0.5
Week 2
+0.2
Week 3
-0.1
Week 4
Week 3: Risk flag triggeredchurn_risk
Week 4: Risk flag triggeredchurn_risk
Churn alert: Sentiment declining for 3 consecutive weeks. Escalation language detected.

Internal Meeting Decision Tracking

Structured Decision Records

What Semarize generates

decision_made = "Approve 15% discount"decision_maker = "VP Sales"rationale = "competitive pressure"action_owner = "AE team"

Your team makes critical decisions in internal meetings — pricing approvals, go/no-go calls on deals, resource allocation. Run internal meeting transcripts through a decision extraction kit. Semarize returns decision_made (the specific decision), decision_maker (who made it), decision_rationale (why), and action_owners (who’s responsible). A Notion database automatically populates with every decision from every meeting. Six months later, when someone asks “why did we approve that discount?” — the answer is structured and searchable.

Learn more about RevOps
Decision Log - Auto-extracted3 decisions
Feb 12Implemented
Approve 15% discount for Enterprise tier
Decision maker: VP Sales
Feb 10Pending
Delay v2.1 launch to March
Decision maker: Head of Product
Feb 7Blocked
Hire 2 additional SREs for Q2
Decision maker: CTO
Source: 3 internal meetings · Auto-synced to Notion

Consultant Engagement Quality

Workshop Quality Scoring

What Semarize generates

methodology_adherence = 0.78client_participation = 0.45actionable_density = 4.2/hrscope_creep = true

Your consulting firm records client workshops and strategy sessions in Otter.ai. Partners need to know whether consultants are delivering value - not just talking. Run workshop transcripts through an engagement quality kit. Semarize scores each session on methodology_adherence (did they follow the framework?), client_participation_ratio (are clients contributing?), actionable_output_density (how many concrete recommendations per hour?), and scope_creep_detection (did discussion drift beyond the SOW?). The monthly partner review includes a quality scorecard for every engagement - no one needs to sit through 40 hours of recordings.

Learn more about QA & Compliance
Engagement ScorecardJ. Parker · Acme Strategy Workshop
Methodology78%
Participation45%
Output Density70%
Scope Control35%
Overall quality rating
57%
Scope creep detected
Recommendation: Increase client participation in next session. Review SOW boundaries.

Custom Knowledge Base Builder

Structured Product Intelligence

Vibe-coded

What Semarize generates

feature_requests = 12bug_reports = 3decisions_logged = 8evidence_spans = 23

A product team lead vibe-codes a React app that ingests Semarize output from every Otter.ai product meeting. The app extracts feature_requests, bug_reports, technical_decisions, and architecture_choices as structured JSON. Each item gets categorized, deduplicated, and tagged with the meeting source. Over 3 months, the team builds a searchable knowledge base of 400+ product decisions - each with the original evidence span from the transcript. New team members onboard by querying decisions, not re-watching recordings.

Learn more about Data Science
Product Knowledge BaseVibe-coded
Search 400+ product decisions...
FeaturesBugsDecisions
FeaturesFeb 14
Add batch export for dashboards
"Users keep asking for CSV export on the dashboard view. Let's prioritize for Q2..."
Source: Product Sync - Feb 14
BugsFeb 12
Auth token refresh fails on mobile
"We're seeing 401s on mobile after 30 min. The refresh token flow isn't triggering..."
Source: Bug Triage - Feb 12
DecisionsFeb 10
Migrate to event-driven architecture
"Agreed - we'll move notifications to an event bus. Jake owns the RFC by Friday..."
Source: Architecture Review - Feb 10

Watch out for

Common Challenges & Gotchas

These are the issues that come up most often when teams start extracting transcripts from Otter.ai at scale.

API access requires account manager approval

The Otter.ai REST API is in beta and not publicly self-serve. You need to contact your account manager to request access. This adds lead time to any integration project - plan for a provisioning delay before you can start building.

OAuth 2.0 token management

Access tokens expire and must be refreshed. If your integration doesn't handle token refresh gracefully, pipelines will fail silently when tokens expire. Implement automatic refresh logic and monitor for authentication errors.

Beta API stability and changes

Since the API is in beta, endpoints, response formats, and rate limits may change without notice. Pin your integration to specific response fields and build in error handling for unexpected schema changes.

Speaker identification accuracy

Speaker labels depend on audio quality, participant count, and whether speakers are registered in your Otter.ai workspace. Unregistered or overlapping speakers may be misidentified. Validate labels before using them for per-speaker analysis.

Manual export limitations

Manual exports (SRT, TXT, PDF) are fine for one-off needs but don't include structured metadata like speaker timestamps, action items, or summary data. For structured downstream processing, the API or Zapier integration is required.

Transcript availability timing

Live transcription is near real-time, but uploaded recordings require processing time. Attempting to fetch a transcript before processing completes returns incomplete data. Build in a polling mechanism or delay before fetching recently completed meetings.

Duplicate processing protection

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

FAQ

Frequently Asked Questions

Explore

Explore Semarize