HubSpot Push API Integration
Send HubSpot call recordings and transcripts to KendoAI using the Push API.
Last updated: Mar 4, 2026
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:
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:
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 - Send Data to Kendo
POST URL: https://app.kendo.ai/api/integrations/push-api/ingest
Required headers:
- Content-Type: application/json
- X-API-Key: {{your_kendo_push_api_key}}
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)
{ "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 5 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.