Back to Docs
🧩

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:

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

    Still need help?

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