Semarize

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

Batch enrichment - process hundreds of calls at once
Visual spreadsheet UI - see all data in a table
Native CRM sync - import from / export to Salesforce, HubSpot
Formula columns - extract and transform enrichment values
CSV import/export - works with any data source
Column-level control - each enrichment runs independently

Consider alternatives when

Real-time event-driven triggers (call ends → instant action) Zapier
Complex branching logic with conditional paths Make
Self-hosted / data sovereignty requirements n8n
Multi-step workflows beyond enrich-and-export Make
Enterprise governance with approval workflows Workato

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

Example table column flow
Source Columns
CSV / CRM import
Column A: call_id (text)
Column B: transcript (long text)
Column C: rep_name (text)
HTTP Enrichment
POST /v1/runs (sync) per row
URL: https://api.semarize.com/v1/runs
Method: POST
Headers: Authorization: Bearer smz_live_...
Body: { kit_code, mode: "sync", input: { transcript: /Transcript/ } }
JSON response per row
Formula Columns
Extract brick values from enrichment
Score: {{HTTP Enrichment}}.output.bricks.overall_score.value
Risk: {{HTTP Enrichment}}.output.bricks.risk_flag.value
Pain: {{HTTP Enrichment}}.output.bricks.pain_point.value
Export to CRM
Push enriched data to Salesforce / HubSpot
Destination: Salesforce Opportunities
Match on: call_id
Map: score → AI_Score__c
Map: risk → Risk_Flag__c

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.

1

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.

CSV UploadDrag and drop a CSV fileMost flexible
SalesforceImport from Opportunity or Call recordsNative sync
HubSpotImport from Deal or Meeting recordsNative sync
Manual pastePaste data directly into the tableQuick testing
Google SheetsImport from a connected spreadsheetOne-way import
API / WebhookPush rows via Clay's APIProgrammatic
Ensure your table has columns for call_id (or a unique identifier) and transcript (the full conversation text). Optionally include rep_name, date, account name, and any other metadata.
2

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

3

Configure the HTTP request

Set the request URL, method, headers, and body in the enrichment column configuration panel.

Configuration

URLhttps://api.semarize.com/v1/runs
MethodPOST
Header 1Authorization: Bearer smz_live_...
Header 2Content-Type: application/json

Request body

HTTP Enrichment body (per row)
// Clay HTTP Enrichment Column
// Runs once per row in your table
{
"kit_code": "YOUR_KIT_CODE",
"mode": "sync",
"input": {
"transcript": /Transcript/ <- Clay column reference
}
}
Where to find your credentials: Generate an API key at Settings API Keys in the Semarize app. Copy the Kit code from your Kit's settings page.
4

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:

The enrichment returns a 200 status with status: "succeeded"
The JSON response contains the expected brick values
The /Column Name/ reference correctly passes the transcript text
No authentication errors (check your API key in the header)
5

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.

Processing time: A table with 100 rows typically completes in 25 minutes depending on transcript length and Clay's concurrency. Larger tables may take longer due to API rate limiting and automatic retries.
6

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

Set the output type (Number, Text, Boolean) to match the brick value type
Add one Formula column per brick value you want to extract
For array values (like evidence), use array indexing: .evidence[0]
Test the formula on a row that has already been enriched
7

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.

Sort by Score column (descending) to surface top-performing calls
Filter Risk column for "true" to find flagged conversations
Check for empty Formula cells - these indicate extraction path mismatches
Verify failed enrichments and re-run those specific rows
8

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)

POST /v1/runs
// POST https://api.semarize.com/v1/runs
// Authorization: Bearer smz_live_...
// Content-Type: application/json
// Sent once per row in the table
{
"kit_code": "discovery_quality_v2",
"mode": "sync", // required for Clay
"input": {
"transcript": /Transcript/ // Clay column ref
}
}

Response (200)

Sync response - stored in enrichment cell
{
"run_id": "run_8f3a...",
"status": "succeeded",
"duration_ms": 1200,
"output": {
"bricks": {
"overall_score": { "value": 72, "confidence": 0.94 },
"risk_flag": { "value": false, "confidence": 0.91 },
"pain_point": { "value": "Losing 3 hrs/week...", ... }
}
}
}

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 nameFormula expressionExample valueOutput type
Score{{Semarize Enrichment}}.output.bricks.overall_score.value72Number
Risk Flag{{Semarize Enrichment}}.output.bricks.risk_flag.valuefalseBoolean
Pain Point{{Semarize Enrichment}}.output.bricks.pain_point.value"Losing 3 hrs/week..."Text
Confidence{{Semarize Enrichment}}.output.bricks.overall_score.confidence0.94Number
Sync fallback: If a sync-mode run exceeds ~30 seconds, Semarize returns 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

overall_score = 72next_steps = truepain_identified = truedecision_maker = present

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.

Import: Salesforce Enrich: discovery_quality Export: Salesforce
Salesforce - Opportunity Record
AccountAcme Corp
OpportunityEnterprise Deal - Q1
AI Score72
Risk FlagNo
Pain PointLosing 3 hrs/week on manual data entry
Next StepsTechnical demo scheduled
SourceClay Enrichment - 247 rows

Synced from Clay enrichment table · 12 minutes ago

Competitive Intelligence Extraction

Extract competitor mentions, context, and sentiment from calls

Market Intel

Bricks used

competitor_mentioned = "Gong"competitor_context = "..."competitor_sentiment = "negative"

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.

Import: CSV Enrich: competitor_intel Export: Sheets / CSV
Competitor Intelligence - Extracted from Calls
CallCompetitorContextSentiment
Acme CorpGong"We currently use Gong but the reporting is limited"Negative
Beta IncChorus"Chorus does conversation tracking but not scoring"Neutral
Gamma LtdClari"Clari handles forecasting but we need call insights"Neutral
Delta CoGong"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

overall_score = 72talk_ratio = 0.65question_count = 8filler_words = "high"

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.

Import: CRM Enrich: coaching_signals Export: Google Sheets
Rep Performance - Aggregated from Clay
RepCallsAvg ScoreRisk CallsTrend
Emily R.24821Improving
Sarah K.19713Stable
James M.22547Declining
Alex P.17762Improving

Aggregated from 82 enriched calls · Last 30 days

Account Health Scoring

Enrich account list with latest call signals for CS teams

Customer Success

Bricks used

risk_flag = truechurn_signal = "budget review"satisfaction_score = 45escalation_needed = true

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.

Import: HubSpot Enrich: account_health Export: HubSpot
Clay Table - Call Enrichment
SOURCESOURCEENRICHMENTFORMULAFORMULAFORMULA
Call IDRepSemarize HTTPScoreRiskPain Point
C-4817Sarah K.{JSON}72NoManual data entry
C-4818James M.{JSON}38YesBudget concerns
C-4819Emily R.{JSON}85NoScaling bottleneck

3 of 247 rows enriched · Last run 4 min ago

Bulk Historical Analysis

Import months of transcripts, score all at once

Batch

Bricks used

overall_score = 72call_stage = "discovery"pain_point = "..."next_steps = true

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.

Import: CSV (3 months) Enrich: discovery_quality Export: CSV / Sheets
Enrichment Column - Row C-4817
{
"status": "succeeded",
"output": {
"bricks": {
"overall_score": { "value": 72 },
"risk_flag": { "value": false },
"pain_point": { "value": "Manual data entry" }
}
}
}
Formula: Score72
Formula: Riskfalse
Formula: Pain PointManual data entry

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.

Connect your Salesforce or HubSpot account in Clay's integrations settings
Import a filtered set of records (e.g., Opportunities with recent call activities)
Add the Semarize HTTP Enrichment column and Formula columns
Run the enrichment and validate the extracted values
Configure the export: select the same CRM, map formula columns to custom fields, set the matching key (record ID)
Run the export - Clay updates each CRM record with the enriched values

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:

Your Semarize plan's rate limit (requests per minute). Check your API Console for current limits.
Clay's concurrency level depends on your Clay plan tier - higher tiers send more concurrent requests.
Large tables (1,000+ rows) may take 15-30 minutes to fully enrich due to retry backoff.
If you consistently hit rate limits, contact Semarize support to discuss higher rate limit tiers.

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

Explore Semarize