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

# HubSpot CRM Contracts

The HubSpot CRM Contracts API exposes a generic CRM object endpoint set parameterised by objectType, providing batch read, create, update, archive, search, and upsert operations against any CRM object collection - including standard objects like companies, contacts, deals, line items, products, tickets, and quotes. Each request takes the objectType as a path parameter and operates on the corresponding object collection using the same v3 patterns. It is the most general-purpose CRM v3 endpoint surface in the HubSpot API.

## For AI agents

Run batch read, create, update, archive, search, and upsert against any HubSpot CRM object type - companies, contacts, deals, products, tickets, quotes, line items - using the generic objectType-parameterised endpoints.

## Scope

Does not define object schemas, manage associations, or send marketing email - use only for record-level CRUD across HubSpot CRM object types.

## Capabilities

- Batch read records of any CRM object type by ID using the objectType path parameter
- Batch create records for any CRM object type with property maps and associations
- Batch upsert records by an idProperty to avoid duplicates across object types
- Search any CRM object type using filter groups with sorting and property selection
- Update records of any object type in batch using PATCH semantics
- Archive records of any object type in batch without permanent deletion
- Page through any object type's records with cursor-based pagination

## Use cases

### Generic Object Sync

Build an integration that syncs many CRM object types using a single client by parameterising the objectType. The same code path handles companies, deals, products, and custom objects, reducing duplication compared to the per-object endpoint surfaces.

Example prompt: Iterate over [companies, deals, products] and call POST /crm/v3/objects/{objectType}/batch/upsert for each, with the appropriate idProperty per object type.

### Cross-Object Search

Search records across several CRM object types from one orchestrator by parameterising the objectType in the search path. Useful when an integration needs to find records by a shared property - for example, an external_id present on contacts, deals, and tickets.

Example prompt: Call POST /crm/v3/objects/{objectType}/search for each of [contacts, deals, tickets] with filterGroups for external_id equals "EXT-12345" and aggregate the results.

### Bulk Archival Job

Run a periodic archival job that archives records older than a retention threshold across multiple object types. The objectType path parameter lets the job run with the same logic per object, only varying the lastmodifieddate filter.

Example prompt: For each objectType in the retention policy, search for records with hs_lastmodifieddate older than the threshold and POST IDs to /crm/v3/objects/{objectType}/batch/archive.

### AI Agent Object-Agnostic Toolkit

An AI agent uses Jentic to call HubSpot CRM operations across any object type without per-object tool definitions. The agent passes the objectType as a parameter, which keeps the agent's tool list small and the schema understanding shared across operations.

Example prompt: Use Jentic search for "create a hubspot crm record", load the schema for /crm/v3/objects/{objectType}/batch/create, and execute with the objectType inferred from the upstream task.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | /crm/v3/objects/{objectType}/batch/create | Create records of any object type in batch |
| POST | /crm/v3/objects/{objectType}/batch/upsert | Idempotent upsert by idProperty for any object type |
| POST | /crm/v3/objects/{objectType}/batch/read | Read records of any object type in batch by ID |
| POST | /crm/v3/objects/{objectType}/batch/update | Update records of any object type in batch |
| POST | /crm/v3/objects/{objectType}/search | Search records of any object type by filter groups |
| GET | /crm/v3/objects/{objectType}/{objectId} | Retrieve a single record of any object type |
| GET | /crm/v3/objects/{objectType} | List records of any object type with pagination |

## Key resources

- **Generic CRM objects** — Object-type-parameterised endpoints for companies, contacts, deals, products, tickets, line items, quotes, and custom objects.
- **Batch operations** — Batch read, create, update, upsert, and archive across any object type.
- **Search** — Filter, sort, and paginate records of any object type using filter groups.

## Why Jentic

- **Setup:** Wiring this HubSpot CRM object API by hand means handling its OAuth 2.0 authorization-code flow, targeting api.hubapi.com, and passing the objectType path parameter plus batch and search payloads yourself. Through Jentic you install once, import the HubSpot CRM object operations from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** The object type travels in the URL path (/crm/v3/objects/{objectType}/...) and HubSpot gates access with per-object OAuth scopes, so you grant only the scopes your agent needs and you choose which operations it may call: you can allow reading and searching records while leaving batch updates out of the allowed set unless you add them.
- **Credential handling:** Your HubSpot OAuth 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 'create a HubSpot record' or 'search CRM objects by property', and Jentic returns the matching generic CRM object operation with its input schema so the agent passes the right objectType without browsing the reference docs.

## Related APIs

- **CRM Custom Objects** — Defines custom object schemas that the generic CRM Contracts endpoints operate on.
- **CRM Associations** — Manages associations between records across object types.
- **Salesforce** — Salesforce SObject REST API offers an equivalent generic record endpoint surface.

## FAQ

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

It supports OAuth 2.0 and HubSpot private app tokens passed as bearer tokens. Through Jentic, tokens are stored encrypted in the vault and a scoped token is injected per request, so raw credentials never enter the agent context.

### Which object types can I use with the HubSpot CRM Contracts API?

Any CRM object type - companies, contacts, deals, line items, products, tickets, quotes, and custom objects. Pass the object type slug as the {objectType} path parameter on each request. Default properties returned vary per object type as documented in the spec.

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

Standard CRM v3 limits apply - 100 requests per 10 seconds for OAuth apps and 110 per 10 seconds for private apps on Pro and Enterprise. Use /crm/v3/objects/{objectType}/batch/upsert (up to 100 records per call) for high-volume sync.

### How do I upsert records through Jentic?

Run the Jentic search "upsert hubspot crm record" to find POST /crm/v3/objects/{objectType}/batch/upsert, load the schema, and execute with objectType set (e.g. companies) and idProperty for the unique key. Jentic handles authentication.

### Is the HubSpot CRM Contracts API free?

Standard object types are accessible on the free HubSpot tier. Custom objects require Enterprise. There is no per-call HubSpot fee on top of the underlying tier subscription.

### Can I use these endpoints to manage associations between objects?

Pass an associations array on create or use the dedicated CRM Associations API for richer association management. The single-record GET supports an associations query parameter to return associated object ids in one response.

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

Yes. Because you self-host Jentic One, your own rules decide which of these operations the agent may call and which HubSpot OAuth scopes back them, so you can allow batch read, single-record retrieval, and search on /crm/v3/objects/{objectType} while leaving batch create, update, upsert, and archive out of the allowed set. Since the object type travels in the URL path, you can also keep the agent to specific object types rather than every CRM collection. The token is stored by your instance and injected only for the calls you permit, so raw credentials never reach the agent.
