Data Enrichment
Enrich Data with Call Analysis in Clay
A practical guide to enriching prospect and account data with structured call analysis signals in Clay. Import tables of transcripts from your CRM or CSV, run Semarize analysis on every row, extract scores and signals into formula columns, and export enriched data back to Salesforce or HubSpot - all inside Clay's spreadsheet UI.
What you'll learn
- How Clay’s table-based enrichment model works with the Semarize API
- How to configure an HTTP Enrichment column to call the /v1/runs endpoint for each row
- Why sync mode is required for Clay and how column references map to the request body
- Five enrichment templates for common use cases — prospect scoring, competitive intelligence, rep performance, account health, and bulk historical analysis
- Common gotchas: enrichment credits, /Column Name/ syntax, JSON extraction in formulas, and rate limiting with large tables
Context
Why Clay for Call Data Enrichment
Clay is a data enrichment platform that works like a smart spreadsheet. Unlike event-driven automation tools (Zapier, Make), Clay processes data in bulk - you import a table of rows, run enrichments across every row, and export the results. This makes it ideal for batch analysis of call data at scale.
Clay strengths
Consider alternatives when
Clay is the best choice when you have a batch of call data - from a CSV export, a CRM query, or a historical backlog - and you want to enrich every row with structured conversation signals. The spreadsheet UI makes it easy to inspect, filter, and export results without writing code or managing automation flows.
Architecture
How Clay + Semarize Works
Clay enrichment follows a column-by-column pattern. Source columns hold your input data. An HTTP Enrichment column calls the Semarize API once per row. Formula columns extract individual values from the enrichment response. Finally, you export the enriched table to your CRM or download as CSV.
1. Import
Bring data into a Clay table. Import from CSV, connect to Salesforce or HubSpot, or paste data directly. Each row is a call with at minimum a transcript column.
CSV, Salesforce, HubSpot, manual paste
2. Enrich
Add an HTTP Enrichment column. It calls the Semarize API with the transcript from each row in sync mode, returning structured analysis inline.
POST /v1/runs with mode: "sync"
3. Extract
Add Formula columns to pull individual brick values from the enrichment JSON - scores, flags, extracted text, evidence, and confidence scores.
{{Enrichment}}.output.bricks.*.value
4. Export
Push the enriched data back to your CRM, download as CSV, or connect to Google Sheets. Field mapping lets you write directly to CRM custom fields.
Salesforce, HubSpot, CSV, Sheets
Why sync mode is required
Clay's HTTP Enrichment expects the API to return the result inline - there is no built-in mechanism for polling or async callbacks. Always set mode: "sync" in the request body. If a sync run exceeds ~30 seconds, the API returns 202 with sync_fallback: true - Clay stores that partial response. For most transcripts under 60 minutes, sync mode completes well within timeout.
Setup Guide
Build Your First Enrichment Table: Step-by-Step
This walkthrough covers everything you need to create a Clay table, enrich rows with Semarize call analysis, extract structured signals into formula columns, and export the results to your CRM.
Create a new Clay table and import your data
Start by creating a blank table in Clay. Import your call data from one of these sources. At minimum, you need a column containing the transcript text for each call.
Add an HTTP Enrichment column
Click the + button to add a new column. Choose Enrichment, then select HTTP / API as the enrichment type. Name the column something descriptive like "Semarize Enrichment".
Configure the HTTP request
Set the request URL, method, headers, and body in the enrichment column configuration panel.
Configuration
Request body
Test with a single row
Before running the enrichment on your entire table, test with a single row. Click the enrichment cell for one row and run it manually. Verify that:
Run the enrichment on all rows
Once the single-row test passes, run the enrichment column for all rows. Click the column header and select "Run all". Clay sends one API request per row concurrently and populates each cell with the full JSON response from Semarize.
Add Formula columns to extract brick values
Add Formula columns to extract individual values from the enrichment JSON. Use dot notation on the enrichment column reference.
Common formula patterns
{{Semarize Enrichment}}.output.bricks.overall_score.value→ Number (72){{Semarize Enrichment}}.output.bricks.risk_flag.value→ Boolean (false){{Semarize Enrichment}}.output.bricks.pain_point.value→ Text{{Semarize Enrichment}}.output.bricks.overall_score.confidence→ Number (0.94){{Semarize Enrichment}}.status→ Text (succeeded)Formula column tips
Validate the enriched data
Review the enriched table. Sort by score to find your best and worst calls. Filter for risk flags to identify at-risk deals. Check a few rows manually to confirm the extracted values match the enrichment JSON.
Export the enriched data
Push the enriched data back to your CRM or download it for further analysis.
Salesforce - Update Opportunities
AI_Score__c, Risk_Flag__c, Pain_Point__c
HubSpot - Update Deals
ai_score, risk_flag, pain_point properties
Google Sheets - Sync to spreadsheet
All formula columns mapped to sheet columns
CSV Download - Export table
All columns exported as CSV file
API Reference
API Request & Response Details
A deeper look at what Clay sends and receives when the HTTP Enrichment column calls the Semarize API. Note how the /Column Name/ syntax maps to the transcript field in the request body.
Request (per row)
Response (200)
How Formula columns extract values
Each Formula column uses dot notation on the enrichment column to extract a single brick value. The column reference uses double curly braces: {{Column Name}}.
| Formula column name | Formula expression | Example value | Output type |
|---|---|---|---|
| Score | {{Semarize Enrichment}}.output.bricks.overall_score.value | 72 | Number |
| Risk Flag | {{Semarize Enrichment}}.output.bricks.risk_flag.value | false | Boolean |
| Pain Point | {{Semarize Enrichment}}.output.bricks.pain_point.value | "Losing 3 hrs/week..." | Text |
| Confidence | {{Semarize Enrichment}}.output.bricks.overall_score.confidence | 0.94 | Number |
202 with sync_fallback: true and a run_id. Clay stores the 202 response as the enrichment value. Since Clay has no polling mechanism, this row will need manual re-processing or you may need to truncate the transcript. For most transcripts under 60 minutes, sync completes well within timeout.Templates
Enrichment Templates for Common Use Cases
Five ready-to-use Clay table patterns for common call data enrichment workflows. Each template shows the table structure, enrichment configuration, and export destination.
Prospect Call Scoring to CRM
Import call list, score each, export scores back to Salesforce
Bricks used
Import a table of recent call transcripts from Salesforce. Enrich each row with a discovery quality Kit. Extract scores and signals into formula columns. Export the enriched scores back to Opportunity records. Reps see AI scores without listening to recordings.
Synced from Clay enrichment table · 12 minutes ago
Competitive Intelligence Extraction
Extract competitor mentions, context, and sentiment from calls
Bricks used
Import a batch of call transcripts and run a competitive intelligence Kit. Extract which competitors were mentioned, the context of each mention, and the prospect's sentiment. Filter the table to build a competitor insights report for product and sales leadership.
| Call | Competitor | Context | Sentiment |
|---|---|---|---|
| Acme Corp | Gong | "We currently use Gong but the reporting is limited" | Negative |
| Beta Inc | Chorus | "Chorus does conversation tracking but not scoring" | Neutral |
| Gamma Ltd | Clari | "Clari handles forecasting but we need call insights" | Neutral |
| Delta Co | Gong | "Gong is too expensive for our team size" | Negative |
4 competitor mentions across 247 enriched calls
Rep Performance Dashboard
Score calls per rep, export aggregated data to Sheets
Bricks used
Import all calls from the last 30 days. Enrich each with a coaching Kit to get scores, talk ratio, question count, and filler word usage. Export to Google Sheets where pivot tables aggregate by rep to create a performance dashboard.
| Rep | Calls | Avg Score | Risk Calls | Trend |
|---|---|---|---|---|
| Emily R. | 24 | 82 | 1 | Improving |
| Sarah K. | 19 | 71 | 3 | Stable |
| James M. | 22 | 54 | 7 | Declining |
| Alex P. | 17 | 76 | 2 | Improving |
Aggregated from 82 enriched calls · Last 30 days
Account Health Scoring
Enrich account list with latest call signals for CS teams
Bricks used
Import your latest customer calls (renewal conversations, QBRs, support calls). Enrich with a health scoring Kit to detect churn signals, satisfaction levels, and escalation needs. Export risk flags back to the CRM so CS teams can prioritize outreach to at-risk accounts.
| SOURCE | SOURCE | ENRICHMENT | FORMULA | FORMULA | FORMULA |
|---|---|---|---|---|---|
| Call ID | Rep | Semarize HTTP | Score | Risk | Pain Point |
| C-4817 | Sarah K. | {JSON} | 72 | No | Manual data entry |
| C-4818 | James M. | {JSON} | 38 | Yes | Budget concerns |
| C-4819 | Emily R. | {JSON} | 85 | No | Scaling bottleneck |
3 of 247 rows enriched · Last run 4 min ago
Bulk Historical Analysis
Import months of transcripts, score all at once
Bricks used
Export three months of call transcripts as CSV. Import into Clay. Run enrichment on the entire table to retroactively score every call. Use formula columns to extract trends: how have discovery scores changed over time? Which reps improved? Download the enriched CSV for BI analysis.
Advanced
Advanced Clay Patterns
Beyond the basic enrichment table - patterns for chaining enrichments, handling large datasets, and building round-trip CRM workflows.
Waterfall enrichments (multiple Kits)
Add multiple HTTP Enrichment columns to the same table, each calling a different Semarize Kit. Column A evaluates discovery quality. Column B extracts competitive intelligence. Column C runs a compliance check. Each column produces its own JSON response, and Formula columns can reference any of them.
Kit 1: Discovery Quality
score, pain, next_steps
Kit 2: Competitor Intel
competitor, context, sentiment
Kit 3: Compliance
disclosure, consent, violations
Each enrichment column consumes credits independently. Three Kit columns on 100 rows = 300 enrichment credits.
Conditional Formula columns
Use Clay's formula language to create conditional columns that derive new values from enrichment results.
Score label: IF(Score >= 70, "Strong", IF(Score >= 50, "Medium", "Weak"))
Categorize calls by quality tier
Priority flag: IF(Risk = true AND Score < 50, "High Priority", "Normal")
Flag at-risk deals needing attention
Combined signal: CONCAT(Score, " | ", Pain Point)
Build a summary string for CRM notes
Numeric conversion: IF(Risk = true, 1, 0)
Convert boolean to number for aggregation
CRM round-trip (import → enrich → export)
The most powerful Clay pattern: import records from your CRM, enrich them with Semarize, and export the results back to the same CRM records. This creates a closed loop where conversation signals flow directly into your CRM fields.
Handling large tables (500+ rows)
For tables with many rows, consider these strategies to manage enrichment credits and API rate limits.
Batch by date range
Import one month at a time instead of the full history. Run enrichment per batch.
Filter before enriching
Use a Formula column to check transcript length. Only enrich rows with non-empty transcripts.
Truncate long transcripts
Add a Formula column that truncates transcripts to 100K characters before the enrichment column references it.
Selective re-enrichment
After initial enrichment, filter for failed or incomplete rows and re-run only those.
Rate limiting considerations
Clay sends enrichment requests concurrently. Depending on your Semarize plan, you may hit rate limits with large tables. Clay handles 429 responses with automatic retries, but you should be aware of:
Watch out for
Common Challenges & Gotchas
These are the issues that come up most often when teams build call data enrichment tables in Clay.
Enrichment credit consumption
Each HTTP Enrichment column run consumes one Clay enrichment credit per row. A table with 500 rows uses 500 credits per enrichment run. Plan your table size and enrichment frequency around your Clay credit allocation.
/Column Name/ syntax is case-sensitive
Clay's column reference syntax uses forward slashes: /Transcript/. The column name inside the slashes must match your column header exactly, including capitalization and spaces. A mismatch sends null to the API.
JSON extraction in Formula columns
Formula columns use dot notation to extract from the enrichment JSON: {{HTTP Enrichment}}.output.bricks.overall_score.value. If your brick name contains special characters, you may need bracket notation. Test with a single row first.
Large transcripts and Clay row size limits
Clay cells have practical size limits. Very long transcripts (90+ minutes) may exceed the row data limit and cause enrichment failures. Consider truncating transcripts in a Formula column before passing them to the HTTP Enrichment column.
Sync mode is required
Clay expects the HTTP Enrichment response to return inline. There is no native mechanism for async polling. Always set mode: "sync" in the Semarize request body. If a sync run exceeds ~30 seconds, the API returns 202 - Clay will store that partial response.
CRM field mapping on export
When exporting enriched data back to Salesforce or HubSpot, the field mapping must match your CRM schema. Custom fields (e.g., AI_Score__c) must already exist in your CRM before Clay can write to them.
Rate limiting with large tables
Clay sends enrichment requests concurrently. For tables with 500+ rows, the Semarize API may return 429 (rate limited). Clay retries automatically, but enrichment may take longer. For very large tables, consider running enrichment in batches.
Enrichment column re-runs overwrite previous results
Re-running an enrichment column replaces the previous JSON response in every row. If you need to preserve historical results, duplicate the table or export to CSV before re-running.
FAQ
Frequently Asked Questions
Explore