canonical: https://jentic.com/apis/hubspot.com/hubspot-crm-calls

# HubSpot Calls

The HubSpot Calls API manages call engagement records in the CRM - the structured log of inbound and outbound calls associated with contacts, companies, and deals. It exposes batch CRUD plus search and upsert against the calls object using the standard CRM v3 object pattern. Each call record can carry properties such as duration, call direction, recording URL, notes, and outcome, and can be associated with other CRM objects.

## For AI agents

Create, read, update, archive, search, and upsert HubSpot CRM call engagement records, with batch endpoints for high-volume telephony logging.

## Scope

Does not place calls, host recordings, or transcribe audio - use only for managing HubSpot CRM call engagement records.

## Capabilities

- Create call engagement records with direction, duration, recording URL, and outcome properties
- Batch upsert call records by an idempotency key to avoid duplicates from retried telephony events
- Search call records by contact, company, date range, or call outcome using filter groups
- Retrieve a call engagement by ID with associated contacts, companies, and deals
- Update call properties (notes, disposition) after the call ends
- Archive call records in batch when removing them from active CRM views
- Page through all call records with cursor-based pagination for export jobs

## Use cases

### Telephony Activity Logging

When a sales rep finishes a call in their dialer, the integration logs it as a call engagement in HubSpot so the rep's manager can see activity against the contact and deal. Batch create handles up to 100 calls per request, suitable for daily reconciliation jobs from the telephony platform.

Example prompt: POST 50 call records to /crm/v3/objects/calls/batch/create with hs_call_direction, hs_call_duration, and contact associations from the dialer export.

### Call Outcome Reporting

Search call records filtered by outcome and date range to drive a weekly sales effectiveness dashboard. The search endpoint supports paging, sorting, and property selection, so the report only pulls the columns it needs.

Example prompt: Search /crm/v3/objects/calls/search with filterGroups for hs_call_disposition equals "Connected" and hs_timestamp in the last 7 days, returning hs_call_duration and ownerId.

### Idempotent Call Upsert

Use batch upsert with an external telephony id as the idempotency key so retried webhooks from the telephony provider do not create duplicate call engagements. This pattern is critical when the provider retries on network failures.

Example prompt: POST to /crm/v3/objects/calls/batch/upsert with idProperty set to hs_unique_creation_key and 100 call payloads from the provider's queue.

### AI Agent Call Enrichment

An AI agent reads the latest call recordings, summarises them with an LLM, and writes the summary plus disposition back to the HubSpot call record. Jentic exposes the search and update operations with typed schemas, so the agent updates the right field without consulting docs.

Example prompt: Search calls in the last 24h missing hs_call_body, fetch each recording, generate a summary, then PATCH /crm/v3/objects/calls/{callId} with the summary and disposition.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | /crm/v3/objects/calls/batch/create | Create call engagements in batch |
| POST | /crm/v3/objects/calls/batch/upsert | Idempotent upsert by external id |
| POST | /crm/v3/objects/calls/batch/read | Read calls in batch by ID |
| POST | /crm/v3/objects/calls/batch/update | Update call properties in batch |
| POST | /crm/v3/objects/calls/search | Search calls by filter groups |
| GET | /crm/v3/objects/calls/{callId} | Retrieve a single call engagement |
| GET | /crm/v3/objects/calls | List calls with pagination |

## Key resources

- **calls** — Call engagement object - direction, duration, recording, disposition, owner.
- **Batch operations** — Batch read, create, update, upsert, and archive for high-volume call logging.
- **Search** — Filter call engagements by contact, owner, outcome, or date range.

## Why Jentic

- **Setup:** Wiring the HubSpot Calls API by hand means handling its OAuth 2.0 authorization-code flow or a private app token, targeting api.hubapi.com, and coding batch and search request shapes yourself. Through Jentic you install once, import HubSpot Calls from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** HubSpot gates this API with per-object OAuth scopes, so you grant only the call-engagement scopes your agent needs and you choose which operations it may call: you can allow reading and searching call records while leaving batch updates out of the allowed set unless you add them.
- **Credential handling:** Your HubSpot OAuth token or private app token is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'log a call in HubSpot' or 'find recent call records', and Jentic returns the matching calls operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **CRM Calling Extensions** — Registers the calling app that creates these call engagement records inside HubSpot.
- **Contacts** — Standard CRM contact object that calls are typically associated with.
- **Twilio** — Twilio Voice exposes raw call records and recordings without the CRM activity layer.

## FAQ

### What authentication does the HubSpot Calls API use?

The Calls API supports OAuth 2.0 (oauth2 and oauth2_legacy) and HubSpot private app tokens. Through Jentic, tokens are stored in the vault and a scoped token is injected per request, so raw credentials never enter the agent context.

### Can I attach a call recording URL with the HubSpot Calls API?

Yes - set the hs_call_recording_url property on create or update. HubSpot stores the URL on the engagement and surfaces a player in the CRM timeline. The recording itself is hosted by your telephony provider; HubSpot does not re-upload the audio.

### What are the rate limits for the HubSpot Calls API?

Standard CRM API limits apply - 100 requests per 10 seconds for OAuth apps and 110 per 10 seconds for private apps. Use /crm/v3/objects/calls/batch/create or /batch/upsert (up to 100 records per request) to stay under the limit during bulk syncs.

### How do I upsert calls through Jentic?

Run the Jentic search "upsert hubspot call records" to find POST /crm/v3/objects/calls/batch/upsert, load its schema, and execute with idProperty set to a unique external id. Jentic handles authentication and returns per-record success or error.

### Is the HubSpot Calls API free?

The Calls API is included with any HubSpot account that has Sales Hub or Service Hub enabled. There is no per-call API charge from HubSpot beyond the underlying tier subscription.

### Can I associate a call with multiple contacts?

Yes - pass an associations array on create, or use the CRM Associations API afterwards, to link a single call engagement to multiple contacts, companies, and deals. The single-record GET supports an associations parameter to return linked IDs in one call.

### Can I limit what my agent is allowed to do with the HubSpot Calls API?

Yes. Because Jentic One is self-hosted, you decide which of the HubSpot Calls operations your agent may call and which OAuth scopes back them, so your own rules govern access to the call-engagement object. HubSpot gates this API with per-object scopes, so you can grant only the call-engagement scopes the agent needs and, for example, allow it to read and search call records while leaving batch create, update, and upsert out of the allowed set. Your HubSpot token is held by your own instance and injected only for the operations you have permitted.
