KendoAI
Kendo AI
All Docs
IntroductionRelease NotesCreating Your AccountDashboard OverviewNext Steps
Uploading CallsUnderstanding ScoresAI CoachingSharing Call Analytics
AI Roleplay TrainingProspect CreatorTraining GoalsPerformance ComparisonSharing AgentsTraining PathsAssign TrainingAI Context
Personal AnalyticsTeam AnalyticsCustom ScorecardsRevenue Tracking
Creating a TeamManaging MembersRoles & PermissionsTeam Settings
Fathom IntegrationZoom IntegrationFireflies IntegrationSlack IntegrationWebhooksPush APIHubSpot Push API IntegrationAloware Push API IntegrationZoom Push API Integration
Subscription PlansCredit SystemAuto-RechargeSeat Billing
TroubleshootingSettings GuideContact Support
Security OverviewTwo-Factor AuthenticationData Processing & PrivacyEnterprise Security
Documentation home

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. 1. In KendoAI, open Integrations > Push API
  2. 2. Select your target team
  3. 3. Click Generate API Key
  4. 4. Copy and save the key immediately (it is only shown once)
  5. 5. Keep this key in a secure secret manager

Step 2 - Build a HubSpot Workflow

  1. 1. In HubSpot, create a workflow for call records (or your call object source)
  2. 2. Set enrollment triggers (for example: call completed and recording URL known)
  3. 3. Add filters to avoid duplicate sends (for example: Kendo Sent = false)
  4. 4. Add an action to send data to Kendo (Webhook action or Custom Code action)
  5. 5. Add a follow-up action that marks the record as sent when Kendo returns success

Incremental Pull Pattern (API Polling Alternative)

  1. If you run a backend sync instead of HubSpot workflow actions, use this pattern:
  2. 1. Store a checkpoint timestamp (last successful sync time)
  3. 2. Query calls created/updated since checkpoint via Calls Search
  4. 3. Request only required properties + associations
  5. 4. Transform records and POST each to Kendo Push API
  6. 5. Advance checkpoint only after successful batch completion
  7. 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

Kendo accepts your Push API key via any of these methods (use whichever your tool supports):

- X-API-Key header (preferred): set header X-API-Key: pk_your_key_here

- Authorization header: set header Authorization: Bearer pk_your_key_here

- Query parameter (easiest for HubSpot workflows): append ?apiKey=pk_your_key_here to the URL

- Request body field: include "apiKey": "pk_your_key_here" in your JSON payload

For HubSpot workflow Webhook actions that don't allow custom headers, the simplest approach is the query parameter:

POST https://app.kendo.ai/api/integrations/push-api/ingest?apiKey=pk_your_key_here

Alternatively, add the apiKey field directly in your JSON request body alongside your call data.

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)

Using query-parameter auth (recommended for HubSpot workflows):

POST https://app.kendo.ai/api/integrations/push-api/ingest?apiKey=pk_your_key_here

{ "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" } }

Or include the API key in the body instead:

{ "apiKey": "pk_your_key_here", "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. 1. Run workflow test on one HubSpot call record
  2. 2. Confirm Kendo returns 201 and a callId
  3. 3. Confirm the call appears in Kendo call history
  4. 4. Confirm rep attribution is correct (repEmail should match a team member)
  5. 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.

PreviousPush API
NextAloware Push API Integration

Still need help?

Can't find what you're looking for? Our team is here to help.