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

# HubSpot Services

The HubSpot CRM Services API provides a generic CRUD, batch, and search interface over any HubSpot CRM object type - including standard objects (companies, contacts, deals, line items, products, tickets, quotes) and custom objects defined via the Schemas API. Endpoints are templated on /crm/v3/objects/{objectType} so a single integration pattern works for every object type in the portal. The API supports single-record operations (read, update, archive), batch read, batch create, batch update, batch upsert by unique property, batch archive, and a full-featured search with filters, sorting, and paging.

## For AI agents

Perform read, write, search, and batch operations on any HubSpot CRM object type - standard or custom - through a single templated /crm/v3/objects/{objectType} interface.

## Scope

Does not handle property definitions, schema creation, or marketing automation - use for record-level CRUD, batch, and search across any object type only.

## Capabilities

- Read any CRM object record by ID via GET /crm/v3/objects/{objectType}/{objectId}
- List records of any object type with pagination using GET /crm/v3/objects/{objectType}
- Create a record of any object type with POST /crm/v3/objects/{objectType}
- Update record properties with PATCH /crm/v3/objects/{objectType}/{objectId}
- Search any object type using POST /crm/v3/objects/{objectType}/search with filters and sort
- Bulk-create records with POST /crm/v3/objects/{objectType}/batch/create
- Upsert records by a unique property using POST /crm/v3/objects/{objectType}/batch/upsert

## Use cases

### Generic CRM Object Sync Layer

Companies that integrate HubSpot with multiple internal systems prefer one templated client over many object-specific ones. The Services API exposes /crm/v3/objects/{objectType} endpoints so a single sync layer can read, write, and search standard objects (companies, deals, line items) and custom objects (loans, projects, vehicles) using the same code paths. New object types added later require zero new integration code.

Example prompt: Call POST /crm/v3/objects/p_loan/batch/upsert with idProperty='external_loan_id' and a list of loan records to sync from the loan origination system.

### Cross-Object Data Backfill

When a new property is added to several HubSpot object types, operations needs to backfill values from a source system. Using POST /crm/v3/objects/{objectType}/batch/update against each object type, the backfill script processes records 100 at a time per object type. The same code handles companies, deals, and any custom object - only the objectType path parameter changes - keeping backfill logic compact and auditable.

Example prompt: For each objectType in [companies, deals, p_loan], call POST /crm/v3/objects/{objectType}/batch/update with batches of 100 records containing the new property values.

### Custom Object Search Across Properties

Sales and operations teams need to filter custom object records by property combinations - e.g., all 'Project' records owned by a given user with status='In Progress' and start_date in the last 30 days. POST /crm/v3/objects/{objectType}/search supports filterGroups, sorts, and after-paging so an agent can paginate through every match. The same endpoint shape works on standard objects too, so one search routine covers the entire portal.

Example prompt: Call POST /crm/v3/objects/p_project/search with filterGroups for hubspot_owner_id and status, sort by start_date descending, and page through results 100 at a time.

### AI Agent Working Across Custom Objects

An AI assistant agent answers questions like 'show me the top 5 active loans for Acme' regardless of whether 'loan' is standard or custom. Through Jentic the agent searches for the generic search and read operations, loads their schemas, and executes them with the right objectType. Jentic stores OAuth credentials in its vault so the agent only handles scoped tokens.

Example prompt: Search Jentic for 'search any hubspot crm object', load the search operation, then execute it with objectType='p_loan' and a filter on associated companyId for Acme.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | /crm/v3/objects/{objectType} | List records of an object type |
| POST | /crm/v3/objects/{objectType} | Create a record |
| GET | /crm/v3/objects/{objectType}/{objectId} | Read a record by ID |
| PATCH | /crm/v3/objects/{objectType}/{objectId} | Update a record |
| POST | /crm/v3/objects/{objectType}/search | Search records of an object type |
| POST | /crm/v3/objects/{objectType}/batch/create | Batch create records |
| POST | /crm/v3/objects/{objectType}/batch/upsert | Batch upsert records by unique property |

## Key resources

- **Basic** — Single-record CRUD on any /crm/v3/objects/{objectType} including read, list, create, update, and archive.
- **Batch** — Batch read, create, update, upsert, and archive endpoints for processing many records of any object type per request.
- **Search** — Filter, sort, and paginate records of any object type via POST /crm/v3/objects/{objectType}/search.

## Why Jentic

- **Setup:** Wiring HubSpot CRM Services by hand means learning its OAuth2 access token or private app token auth, targeting the api.hubapi.com host, and handling batch and search calls across object types yourself. Through Jentic you install once, import HubSpot CRM Services from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** The Services API puts both the object type and record id in the URL path (/crm/v3/objects/{objectType}/{objectId}), so a rule can pin your agent to one object type and its records for read and update. You choose the operations it may call, so batch create and batch upsert are not included unless you add them.
- **Credential handling:** Your HubSpot access 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 'list HubSpot CRM records' or 'search records by property', and Jentic returns the matching Services operation with its input schema so the agent calls the right object type without browsing the reference docs.

## Related APIs

- **Salesforce REST API** — Salesforce sObject REST API offers similar generic CRUD across any object type, including custom objects.
- **HubSpot Custom Objects** — Custom Objects API offers a focused interface for custom-only object CRUD when you don't need the generic shape.
- **HubSpot CRM Schemas** — Define custom object types via Schemas before performing CRUD on their records via Services.

## FAQ

### What authentication does the HubSpot CRM Services API use?

It supports OAuth 2.0 (recommended for public apps) and HubSpot private app access tokens passed as a Bearer token in the Authorization header. Through Jentic the token is stored encrypted in the vault and injected at execution time so the agent never holds the raw secret.

### Can I use the Services API on standard objects like Contacts and Deals?

Yes. The {objectType} path parameter accepts both standard object types (contacts, companies, deals, tickets, quotes, line items, products) and custom object IDs, so the same endpoints power CRUD across all of them.

### What are the rate limits for the HubSpot CRM Services API?

HubSpot enforces 100 requests per 10 seconds for OAuth apps and 190 per 10 seconds for private apps on Enterprise tiers, plus daily quotas. Use POST /crm/v3/objects/{objectType}/batch/create, batch/update, and batch/upsert (up to 100 records each) to stay efficient.

### How do I upsert records by an external ID through Jentic?

Search Jentic for 'upsert hubspot crm record by external id', load POST /crm/v3/objects/{objectType}/batch/upsert, and execute it with idProperty set to your external ID property and inputs containing the records. Jentic returns typed responses for each record.

### Does the search endpoint support filtering by associations?

Yes. POST /crm/v3/objects/{objectType}/search accepts filters on associated record IDs (e.g., associations.deal) alongside property filters, plus sort and paging. Use after-tokens to page through more than 200 results.

### Can I list records that have been archived?

Yes. Pass archived=true on GET /crm/v3/objects/{objectType} to retrieve archived records. Without this parameter, only active records are returned.

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

Yes. Because you run Jentic One yourself, your own rules decide which Services operations the agent may call and which credentials it may use. Since this API puts the object type and record id in the path (/crm/v3/objects/{objectType}/{objectId}), you can pin the agent to reads and updates on a single object type and its records, and grant only the operations you intend. Higher-impact calls like POST /crm/v3/objects/{objectType}/batch/create and batch/upsert stay unavailable unless you explicitly add them.
