HubSpot API: Authentication, Endpoints & Rate Limits

The HubSpot API is the REST interface for reading and writing CRM data - contacts, companies, deals, tickets, and their associations - under /crm/v3/ (and /crm/v4/ for associations). It authenticates with a bearer token (a Service Key, a private app access token, or an OAuth access token), returns JSON, and is rate-limited per second and per day based on your HubSpot subscription.

This page covers how authentication works, the endpoints and objects you'll use most, rate limits and pagination, and where Knit's unified API and MCP server fit if you're connecting HubSpot alongside other CRMs.

Authentication

HubSpot retired its legacy static API keys in 2022. Today, API calls are authenticated with a bearer token from one of three sources: a Service Key (account-level, data-only, in public beta since February 2026), a private app access token (supports webhooks and UI extensions), or an OAuth 2.0 access token from a project-based app (required for Marketplace or multi-account integrations). All three are sent the same way: Authorization: Bearer <token> (HubSpot Developers, Account Service Keys).

For the full walkthrough — creating a Service Key or private app, choosing between them, and a working curl example - see How to Get a HubSpot API Key.

Resource Example endpoint What it's for
Contacts GET/POST/PATCH /crm/v3/objects/contacts Create, read, update people records
Companies GET/POST/PATCH /crm/v3/objects/companies Create, read, update organization records
Deals GET/POST/PATCH /crm/v3/objects/deals Create, read, update sales opportunities
Tickets GET/POST/PATCH /crm/v3/objects/tickets Create, read, update support tickets
Search POST /crm/v3/objects/{objectType}/search Filter and sort any CRM object by property values
Associations GET/PUT /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType} Link records together (e.g., a contact to a deal)
Properties GET /crm/v3/properties/{objectType} List standard and custom fields for an object type

The full, current set of endpoints and required scopes is in HubSpot's CRM API documentation - check each endpoint's page before assuming a token has access.

Common tasks

  • Create a contact: POST /crm/v3/objects/contacts with a properties object containing fields like email, firstname, lastname.
  • Update a deal: PATCH /crm/v3/objects/deals/{dealId} with the properties to change, such as dealstage or amount.
  • Search records: POST /crm/v3/objects/{objectType}/search with filterGroups, sorts, and properties to return — the shared 5 requests/second Search API limit applies regardless of object type.
  • Associate records: PUT /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} to link, for example, a contact to a company or deal.
  • List custom fields: GET /crm/v3/properties/{objectType} to see which standard and custom properties exist before reading or writing them.
  • Fetch open support tickets: see Knit's walkthrough on how to fetch open tickets from the HubSpot API for the properties lookup, pagination, and per-contact filtering involved.

Rate limits and pagination

HubSpot enforces both per-second (burst) and daily rate limits, scoped to your account and subscription tier, documented at HubSpot's API usage guidelines and limits:

Credential / tier Burst limit Daily limit
Service Key / private app — Free or Starter 100 requests / 10 sec 250,000 / day
Service Key / private app — Professional 190 requests / 10 sec (250 with the API limit increase add-on) 625,000 / day (+1,000,000 per add-on, max 2 add-ons)
Service Key / private app — Enterprise 190 requests / 10 sec (250 with the API limit increase add-on) 1,000,000 / day (+1,000,000 per add-on, max 2 add-ons)
OAuth (project-based app, marketplace-distributed) 110 requests / 10 sec per connected account (add-on does not increase this) No daily limit tracked for OAuth-authenticated calls
Search API (any object type) 5 requests / sec, shared across all object types

Every response includes X-HubSpot-RateLimit-Max and X-HubSpot-RateLimit-Remaining (the burst limit and remaining requests for the current window, with the window length given in X-HubSpot-RateLimit-Interval-Milliseconds), plus - for non-OAuth credentials - X-HubSpot-RateLimit-Daily / X-HubSpot-RateLimit-Daily-Remaining. The older X-HubSpot-RateLimit-Secondly / X-HubSpot-RateLimit-Secondly-Remaining headers are still sent but are deprecated and no longer enforced - don't build new logic against them. Search API responses don't include any of these rate-limit headers. Exceeding a limit returns 429 with a JSON body containing errorType: "RATE_LIMIT" and a policyName of SECONDLY or DAILY telling you which limit you hit.

For pagination, list and search endpoints under /crm/v3/ and /crm/v4/ use cursor pagination: each response includes a paging.next.after value, which you pass back as the after query parameter to fetch the next page. Keep paging until paging.next is absent from the response.

Build it yourself vs. use a unified API

Calling the HubSpot API directly works well for a single account: pick the right credential (Service Key, private app, or OAuth), track per-second and daily limits, and handle cursor pagination on list and search endpoints. It gets more involved once you're connecting HubSpot alongside other CRMs - each with its own auth model, object schema, and rate-limit shape.

Knit's unified CRM API normalizes HubSpot contacts, companies, deals, and tickets alongside connectors like Salesforce behind one schema, handles the auth setup described in the HubSpot API key guide, and manages rate-limit backoff for you. See Knit's HubSpot connector for what's available, or book a demo to see it against your own account. You can also sign up free and connect a sandbox HubSpot account.

Knit's HubSpot connector and AI/MCP

Knit also runs a HubSpot MCP Server, which gives AI agents read/write access to HubSpot CRM objects - contacts, companies, deals, custom objects and fields - through the same unified layer, so an agent built against Knit's MCP doesn't need separate HubSpot-specific auth or endpoint logic.

FAQ

Is the HubSpot API a REST API?

Yes - the HubSpot CRM API follows REST conventions (GET, POST, PATCH, DELETE on resource URLs, JSON request and response bodies) under /crm/v3/ for most objects and /crm/v4/ for associations. HubSpot also offers webhook subscriptions for real-time events, available to private apps and project-based apps but not Service Keys.

How do I authenticate to the HubSpot API?

Send a bearer token in the Authorization header: Authorization: Bearer <token>. The token can come from a Service Key (data-only, no webhooks), a private app (supports webhooks), or an OAuth 2.0 flow for multi-account integrations. See the HubSpot API key guide for how to create each.

How do I paginate through HubSpot CRM records?

List and search endpoints return a paging.next.after value when more results exist. Pass that value as the after query parameter on your next request, and repeat until paging.next is no longer present in the response. This applies to /crm/v3/objects/{objectType} and the /search endpoints alike.

What happens if I exceed HubSpot's API rate limits?

HubSpot returns 429 with errorType: "RATE_LIMIT" and a policyName of SECONDLY (burst) or DAILY. Burst limits range from roughly 100 to 190+ requests per 10 seconds depending on your subscription tier, with the Search API capped separately at 5 requests/second across all object types. Knit handles this backoff automatically across the HubSpot connections it manages.

#1 in Ease of Integrations

Trusted by businesses to streamline and simplify integrations seamlessly with GetKnit.