Integrations·Updated Mar 4, 2026
HubSpot Push API Integration
Send HubSpot call recordings and transcripts to KendoAI using the Push API.
When to Use This
Use this integration if your team logs calls in HubSpot and you want those calls analyzed in KendoAI automatically.
This approach uses HubSpot workflows to POST call data into Kendo's Push API.
It's ideal for RevOps teams who want flexible routing without a full custom backend.
HubSpot APIs You Can Pull From
For read-side ingestion, HubSpot's primary source is the Calls object API.
Core endpoints:
- GET /crm/v3/objects/calls (paged list pull)
- POST /crm/v3/objects/calls/search (filtered pull by date/status and other properties)
- GET /crm/v3/objects/calls/{callId} (single call details)
Useful companion endpoints:
- GET /crm/v3/owners (map owner IDs to owner emails/names for rep attribution)
- Associations on calls (contacts, companies, deals, tickets) to enrich metadata
Recommended strategy: use Search for incremental sync and Get-by-ID for retries or detail hydration.
What You Need
Before setup, make sure you have:
A KendoAI team with Push API enabled
A generated Push API key from Integrations > Push API
HubSpot workflow permissions (and Operations Hub for custom code steps, if used)
A HubSpot private app or OAuth app with read access for Calls (and any associated objects you need)
Access to call recording URLs and/or transcript-related fields in your HubSpot portal
HubSpot Call Fields to Request
When pulling from calls, explicitly request the properties you need so payloads stay small and predictable.
Most teams should include:
hs_timestamp (call time)
hs_call_title (maps well to Kendo callTitle)
hs_call_body (notes; can be used as transcript fallback)
hs_call_duration (milliseconds in HubSpot)
hs_call_status and hs_call_direction
hs_call_recording_url (audio URL when available)
hubspot_owner_id (rep mapping)
hs_call_disposition (outcome metadata)
Optional but helpful: call-to/call-from numbers, activity type, and associated object IDs.
Transcript Reality Check (Important)
HubSpot's Calls object is excellent for call metadata and recording URLs, but transcript text is not always directly returned as a simple call property value.
In many portals, you can detect transcript availability, but the full transcript content may be managed via HubSpot Conversation Intelligence and related extension flows.
If you cannot pull transcript text directly from Calls, use one of these patterns:
- Send audioUrl only to Kendo and let Kendo transcribe/analyze
- Store transcript text in your own integration-owned field and map that into transcript
- Use HubSpot's recordings/transcriptions extension architecture where applicable
Step 1 - Generate a Push API Key
- 1. In KendoAI, open Integrations > Push API
- 2. Select your target team
- 3. Click Generate API Key
- 4. Copy and save the key immediately (it is only shown once)
- 5. Keep this key in a secure secret manager
Step 2 - Build a HubSpot Workflow
- 1. In HubSpot, create a workflow for call records (or your call object source)
- 2. Set enrollment triggers (for example: call completed and recording URL known)
- 3. Add filters to avoid duplicate sends (for example: Kendo Sent = false)
- 4. Add an action to send data to Kendo (Webhook action or Custom Code action)
- 5. Add a follow-up action that marks the record as sent when Kendo returns success
Incremental Pull Pattern (API Polling Alternative)
- If you run a backend sync instead of HubSpot workflow actions, use this pattern:
- 1. Store a checkpoint timestamp (last successful sync time)
- 2. Query calls created/updated since checkpoint via Calls Search
- 3. Request only required properties + associations
- 4. Transform records and POST each to Kendo Push API
- 5. Advance checkpoint only after successful batch completion
- 6. On failures, retry by call ID to avoid losing records
Step 3 - Authenticate with Kendo
POST URL: https://app.kendo.ai/api/integrations/push-api/ingest
Authenticate with your Push API key in a request header — one of:
- X-API-Key header (preferred): set header X-API-Key: pk_your_key_here
- Authorization header: set header Authorization: Bearer pk_your_key_here
Header authentication is required. Query-parameter (?apiKey=) and request-body (apiKey) authentication are not supported.
HubSpot's native workflow Webhook action cannot send custom headers, so use a Custom code action (it can set headers) or route the call through Zapier/Make/n8n, which all support custom headers.
Step 4 - Map Payload Fields
Required header: Content-Type: application/json
Recommended payload mapping:
- callTitle <- HubSpot call title/name property
- repName <- owner full name
- repEmail <- owner email
- callDate <- call timestamp in ISO format
- duration <- hs_call_duration (HubSpot ms; Kendo normalizes automatically)
- audioUrl <- recording URL (if available)
- transcript <- transcript text (only if you can reliably fetch it in your portal/setup)
- metadata.source = "hubspot" plus callId/ownerId/dealId/contactId context
Recommended Metadata Contract
To simplify debugging and analytics, include this metadata in every payload:
- metadata.source = "hubspot"
- metadata.hubspotCallId
- metadata.hubspotOwnerId
- metadata.hubspotContactIds (if associated)
- metadata.hubspotDealIds (if associated)
- metadata.syncMethod (workflow | polling)
This makes it easy to reconcile Kendo calls back to HubSpot records.
Example Payload (HubSpot to Kendo)
POST https://app.kendo.ai/api/integrations/push-api/ingest
Headers: X-API-Key: pk_your_key_here and Content-Type: application/json
Body:
{ "callTitle": "Discovery - Acme", "repName": "Sam Lee", "repEmail": "sam@yourco.com", "callDate": "2026-03-04T16:30:00Z", "duration": 1250000, "audioUrl": "https://...", "metadata": { "source": "hubspot", "hubspotCallId": "987654321", "hubspotOwnerId": "41629711", "hubspotDealIds": "123456" } }
HubSpot duration is typically milliseconds; Kendo accepts ms/seconds/minutes and normalizes.
At least one of transcript or audioUrl must be present.
HubSpot Limits and Reliability
HubSpot enforces API limits and can return 429 when burst thresholds are exceeded.
Implement retry with exponential backoff and jitter, and honor Retry-After when present.
Use smaller pages/batches to reduce failures and make retries cheaper.
Keep an idempotency guard in HubSpot (for example, Kendo Sent + Kendo Call ID properties).
Validation Checklist
- 1. Run workflow test on one HubSpot call record
- 2. Confirm Kendo returns 201 and a callId
- 3. Confirm the call appears in Kendo call history
- 4. Confirm rep attribution is correct (repEmail should match a team member)
- 5. Confirm no duplicate sends for re-enrolled records
Troubleshooting
401 Unauthorized - API key missing/invalid; regenerate or update workflow secret.
400 Bad Request - Missing transcript/audioUrl or invalid field formats.
413 Payload Too Large - Request exceeded 10 MB; trim transcript or metadata.
429 Rate Limit - Exceeded 30 requests/min; queue retries with delay.
No rep attribution - Ensure repEmail maps to a member in the Kendo team.
Missing transcript text - Pulling metadata is expected; send audioUrl and allow Kendo transcription when transcript content is not directly available.