Semarize

Get Your Data

Grain - How to Get Your Conversation Data

A practical guide to getting your conversation data out of Grain - covering API access, recording retrieval, webhook-triggered flows, transcript extraction, and how to route structured data into your downstream systems.

What you'll learn

  • What conversation data you can extract from Grain - transcripts, recordings, intelligence notes, and highlight metadata
  • How to access data via the Grain Public API - OAuth authentication, endpoints, and recording retrieval
  • Three extraction patterns: historical backfill, incremental polling, and webhook-triggered
  • How to connect Grain data pipelines to Zapier, n8n, and Make
  • Advanced use cases - highlight validation, customer voice trends, meeting effectiveness, and deal room intelligence

Data

What Data You Can Extract From Grain

Grain captures more than just the recording. Every meeting produces a set of structured assets that can be extracted via API - the transcript itself, AI-generated intelligence notes, highlight clips, and contextual metadata about the meeting and its participants.

Common fields teams care about

Full transcript text
AI-generated intelligence notes
Speaker labels and identification
Highlight clips and annotations
Meeting date, time, and duration
Participant list and roles
Recording URL and availability
Associated CRM record context
Webhook event metadata
Meeting title and description

API Access

How to Get Transcripts via the Grain API

Grain exposes recordings and transcripts through a REST API at api.grain.com/_/public-api/. The workflow is: authenticate with a Bearer token (OAuth), then fetch recordings by ID to retrieve transcripts and intelligence notes.

1

Authenticate

Grain uses Bearer Token (OAuth) authentication. Generate an API token from your Grain workspace settings and pass it in the Authorization header on every request.

Authorization: Bearer <your_grain_api_token>
Content-Type: application/json
API access requires a Business plan ($29/seat/month). Free and Pro plans do not include API access. Contact your Grain workspace admin to provision credentials if you don't have them.
2

Fetch a recording by ID

Call the recording endpoint with a specific recording ID. The response includes the transcript, intelligence notes, and metadata about the meeting.

GET https://api.grain.com/_/public-api/recordings/<recording_id>

// Response includes:
// - transcript (full text)
// - intelligence_notes (AI-generated)
// - metadata (date, duration, participants)

The response returns the recording object with transcript, intelligence_notes, title, duration, and participant data. Use recording IDs from webhook events or your stored list of known recordings.

3

Set up webhooks for real-time events

Register webhook endpoints in your Grain workspace settings. Grain fires events for key actions so you can process data as soon as it becomes available.

// Supported webhook events:
// - recording.added    → New recording processed
// - recording.removed  → Recording deleted
// - highlight.added    → New highlight created
// - highlight.updated  → Highlight modified
// - highlight.removed  → Highlight deleted

Each webhook payload includes the resource ID and metadata. Use the recording.added event as your trigger for transcript extraction - this fires after Grain finishes processing the recording and the transcript is available.

4

Handle rate limits and processing timing

Rate limits

Grain enforces API rate limits. When you receive a 429 response, back off and retry after a delay. For bulk operations, pace requests and implement exponential backoff to avoid hitting ceilings during backfills.

Processing timing

Transcripts are not available the instant a meeting ends. Grain processes recordings asynchronously - use the recording.added webhook as your signal that the transcript is ready, rather than polling immediately after a call ends.

Patterns

Key Extraction Flows

There are three practical patterns for getting transcripts out of Grain. 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 recordings

1

Compile a list of recording IDs from your Grain workspace - either from your internal tracking system, CRM integration logs, or by exporting from the Grain UI

2

For each recording ID, call the Grain API to fetch the recording with transcript and intelligence notes. Pace requests to stay within rate limits

3

Store each transcript with its recording metadata (recording ID, date, participants, duration) in your data warehouse or object store

4

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

5

Set up webhooks for ongoing processing so new recordings are handled automatically going forward

Tip: Track processed recording IDs in a separate store. If the process is interrupted, you can skip already-processed recordings instead of re-fetching 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, check for new recording IDs that have been added since your last successful poll - sourced from webhook event logs, CRM sync records, or a tracking table

3

Fetch transcripts and intelligence notes for any new recording IDs. Use the recording 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 checkpoint to the current run time for the next poll cycle

Tip: Combine polling with webhook event logs. Webhooks give you near real-time IDs, while polling acts as a safety net to catch any missed events.

Webhook-Triggered

Near real-time on recording completion

1

Register a webhook endpoint in your Grain workspace settings. Subscribe to the recording.added event - this fires when Grain finishes processing a recording and the transcript is available

2

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

3

Immediately fetch the transcript and intelligence notes via the Grain API using the recording ID from the event

4

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

Note: Webhooks are available on the Business plan. Grain supports events for recordings (added/removed) and highlights (added/updated/removed). Implement idempotent handlers to gracefully handle duplicate deliveries.

Automation

Send Grain Transcripts to Automation Tools

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

ZapierNo-code automation

Grain → Zapier → Semarize → CRM

Detect new Grain recordings 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: Grain Webhook
Fires when a new recording is processed
App: Webhooks by Zapier
Event: Catch Hook
Source: Grain recording.added
Webhooks by Zapier
Fetch recording from Grain API
Method: GET
URL: https://api.grain.com/_/public-api/recordings/{{recording_id}}
Auth: Bearer <grain_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 "Webhooks by Zapier" as the trigger and select "Catch Hook". Copy the webhook URL and register it in your Grain workspace settings for the recording.added event.

2

Add a "Webhooks by Zapier" Action (Custom Request) to fetch the recording from Grain. Set method to GET, URL to https://api.grain.com/_/public-api/recordings/{{recording_id}}, and add your Bearer token header.

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: 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

Grain → n8n → Semarize → Database

Receive Grain webhook events in n8n, fetch the full transcript, send it to Semarize for analysis, then write the structured scores and signals to your database. n8n's native loop support handles batch processing gracefully.

Example Workflow
Webhook - Grain Event
Receives recording.added events
Method: POST
Path: /grain-webhook
Auth: Header token
HTTP Request - Fetch Recording
GET /recordings/:id (Grain)
Method: GET
URL: https://api.grain.com/_/public-api/recordings/{{$json.recording_id}}
Auth: Bearer <grain_token>
Transcript extracted
Code - Format Transcript
Extract and clean transcript text
Extract: transcript from response
Clean: remove metadata noise
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: recording_evaluations
Columns: recording_id, score, risk_flag, pain_point

Setup steps

1

Add a Webhook node as the workflow trigger. Copy the webhook URL and register it in your Grain workspace settings for the recording.added event.

2

Add an HTTP Request node to fetch the recording from Grain. Set method to GET, URL to https://api.grain.com/_/public-api/recordings/{{$json.recording_id}}, and configure your Bearer token auth.

3

Add a Code node (JavaScript) to extract the transcript from the Grain response. Clean up any formatting and prepare the text for analysis.

4

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.

5

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

6

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

7

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

Watch out for: Use recording IDs as deduplication keys to prevent reprocessing. Grain webhooks may fire duplicate events during retries. 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

Grain → Make → Semarize → CRM + Slack

Receive Grain webhook events in Make, fetch the transcript, send it 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
Webhook - Grain Event
Receives recording.added events
Custom webhook URL
Source: Grain recording.added
HTTP - Fetch Recording
GET /recordings/:id (Grain)
Method: GET
URL: https://api.grain.com/_/public-api/recordings/{{recording_id}}
Auth: Bearer <grain_token>
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 recording
Channel: #deal-alerts
Message: Risk on {{recording_id}}, score: {{score}}
Branch 2 - All recordings
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 Webhooks module (Custom webhook) as the trigger. Copy the URL and register it in your Grain workspace settings for the recording.added event.

2

Add an HTTP module to fetch the recording from Grain. Set method to GET, URL to https://api.grain.com/_/public-api/recordings/{{recording_id}}, and configure your Bearer token auth.

3

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.

4

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

5

On Branch 1, add a Slack module to alert your team when risk is detected. Map the score, risk flag, and recording ID into the message.

6

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

7

Test the scenario end-to-end by triggering a test recording in Grain.

8

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 50 recordings uses ~150 operations (webhook + Grain fetch + Semarize per recording). 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 Grain Data in Semarize

Highlight quality scoring, longitudinal trend analysis, multi-dimensional meeting effectiveness, and building your own tools on structured conversation data.

Highlight Validation and Scoring

Quality Assurance for Highlights

What Semarize generates

business_relevance = 0.38actionability = 0.52accuracy = 0.91highlights_scored = 500

Grain lets team members create highlights from meetings — but highlights are subjective and inconsistent. One person's "key moment" is another's filler. Run every meeting transcript through a highlight quality kit. Semarize scores each auto-detected highlight for business_relevance (does it relate to a deal signal?), actionability (does it contain a commitment or decision?), and accuracy (does the highlight summary match the transcript evidence?). After scoring 500 highlights across your team, the data shows that only 38% of manual highlights are actually business-relevant. Grain becomes the recording layer; Semarize becomes the quality layer.

Learn more about QA & Compliance
Highlight Quality Report500 highlights scored
Prospect confirmed Q3 budget allocation
Rel: 0.91Act: 0.87Acc: 0.95
Team discussed weather over the weekendLow Relevance
Rel: 0.12Act: 0.08Acc: 0.94
Decision-maker committed to pilot by March
Rel: 0.94Act: 0.92Acc: 0.88
Rep mentioned competitor pricing casuallyLow Relevance
Rel: 0.31Act: 0.15Acc: 0.9
4 highlights shown · 2 flagged as low relevance · 38% business-relevant overall

Customer Voice Trend Analysis

Longitudinal Sentiment Tracking

What Semarize generates

satisfaction_trajectory = "-41pts"feature_request_trend = "3x"churn_language = trueintervention_timing = "6 weeks early"

Your CS team records every customer call in Grain. Individual call summaries are useful — but what about trends across accounts? Run 6 months of transcripts through a customer sentiment kit. Semarize tracks satisfaction_trajectory, feature_request_frequency, churn_language_density, and expansion_readiness per account over time. A monthly report shows that Account X’s satisfaction dropped from 82 to 41 over 4 months while feature requests tripled — a clear churn signal that surfaces only when you analyze longitudinally. The CS team intervenes before the renewal conversation.

Learn more about Customer Success
Customer Voice Trend - Account X
6-month rolling analysis
Churn Risk
Sep
Oct
Nov
Dec
Jan
Feb
Satisfaction
Feature Requests
Churn alert triggered: satisfaction −41pts over 4 months, feature requests 3x

Sales Meeting Effectiveness Index

Multi-Dimension Scoring

What Semarize generates

avg_effectiveness = 61top_ae_score = 84key_driver = "discovery_depth"variance_explained = "70%"

Your sales team runs 300 meetings a month through Grain. But meeting count isn't a KPI — meeting quality is. Run every sales meeting through an effectiveness kit. Semarize scores each for discovery_depth (how well were pain points uncovered?), stakeholder_engagement (did decision-makers speak?), competitive_positioning (was differentiation articulated?), and momentum_maintained (was energy consistent throughout?). Reps get a personal effectiveness index that trends over time. The top AE scores 84 on average; the team average is 61. The gap analysis shows that discovery_depth explains 70% of the score variance. Training shifts to focus on discovery skills.

Learn more about Sales Coaching
Rep Effectiveness Index - 300 meetings scored
#1Sarah K.
84
Disc: 91Eng: 82Comp: 78Mom: 85
#2Mark T.
72
Disc: 68Eng: 79Comp: 71Mom: 70
#3Priya R.
58
Disc: 45Eng: 62Comp: 60Mom: 65
#4Jake L.
51
Disc: 38Eng: 55Comp: 52Mom: 59
Key Driver: discovery_depth explains 70% of score variance

Custom Deal Room Intelligence

Structured Deal Context

Vibe-coded

What Semarize generates

conversation_health = 0.73risk_signals = 2stakeholder_coverage = "4/6"momentum = "declining"

A sales ops manager vibe-codes a Notion-integrated deal room that pulls Semarize scores from every Grain recording associated with an opportunity. Each deal room page auto-populates with: conversation health score (composite of 6 Bricks), key risk signals with evidence quotes, stakeholder map (who attended which calls), and meeting momentum trend. When a prospect's CFO attended the last two calls but went silent, the deal room flags it. Pipeline reviews happen in the deal room, not in Grain — because the data is structured, contextual, and connected to the deal narrative.

Learn more about RevOps
Deal RoomVibe-coded with Notion
Acme Corp$95k · Stage 4
73
Stakeholder Coverage (4/6)
VP Sales
4 calls
CFO
2 calls
CTO
3 calls
Legal
1 calls
Champion
5 calls
Procurement
None
Momentum:Declining
Risk: CFO silent for 2 calls
Evidence: CFO attended calls #3 and #4 but has not joined the last 2 sessions

Watch out for

Common Challenges & Gotchas

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

Business plan required for API access

Grain's Public API is only available on the Business plan at $29/seat/month. Teams on Free or Pro plans cannot access the API, which limits automation options to manual exports or native integrations only.

OAuth token management

Grain uses Bearer Token (OAuth) authentication. Tokens can expire or be revoked. Implement token refresh logic and handle 401 responses gracefully to avoid silent failures in automated pipelines.

Recording processing delay

Grain processes recordings asynchronously after a meeting ends. Attempting to fetch a transcript too soon will return incomplete data. Use webhooks (recording added) as your trigger rather than polling immediately after a call.

Limited bulk listing endpoints

The Grain API is oriented around fetching individual recordings by ID rather than bulk listing by date range. You may need to combine webhook events with stored recording IDs to build a comprehensive extraction pipeline.

Webhook reliability and retries

Webhook deliveries can fail due to network issues or endpoint downtime. Implement idempotent handlers and use recording IDs as deduplication keys. Consider a periodic reconciliation poll to catch any missed events.

Intelligence notes vs. raw transcript

Grain provides both raw transcripts and AI-generated intelligence notes. Decide which data source to use for your analysis — raw transcripts for full-fidelity analysis, or intelligence notes for pre-summarized context. Mixing them without clarity can produce inconsistent results.

Integration ecosystem differences

Grain's native integrations (HubSpot, Salesforce, Slack, Zapier) push specific data formats. When building custom pipelines via the API, the data structure may differ from what native integrations provide. Test and validate the API response shape before building downstream logic.

FAQ

Frequently Asked Questions

Explore

Explore Semarize