API review

HubSpot API review

The SMB/mid-market CRM platform: contacts, companies, deals, tickets and custom objects behind a date-versioned REST API (2026-09), batch upsert, associations, lists, imports/exports, webhooks and an official remote MCP server. Best for system of record for contacts/companies/deals when the client already runs HubSpot.

Verified 25 Oct 2026 · 11 endpoints listed · Official MCP server

What a call costs

The actions you pay for, as HubSpot prices them.

ActionCostPer
API Limit Increase capacity packUS$500/month per pack (US$1,000/month for two)+1,000,000 calls/day each, max 2 packs; burst figure disputed (see rate_limits)
HubSpot Credits beyond plan allowance (Pay-as-You-Go)US$0.010per credit
HubSpot Credits capacity packUS$10per 1,000 credits/month for the rest of the term
Required onboarding (one-time)US$1,500 (Professional) / US$3,500 (Enterprise)per portal

Pricing, plan by plan

US dollars, as HubSpot's pricing page shows them on 25 Oct 2026. Monthly and annual billing are shown apart.

Free tier Free tools: US$0, up to 2 users, no credit card; contact limit 1,000 on free accounts (15 million on paid). Signup: email code, then password of 12+ characters with mixed case; signups are throttled per network/email after about 5 codes in an hour (our trial, 2026-10-25).

Sales Hub Starter

$20/mo

billed monthly

$20/mo

billed annually

Per seat; 500 HubSpot Credits; list price US$20/seat/mo on both terms.

API included
Plan details

New-customer promotion live on 2026-10-25 ('Save up to 65% on Starter', 'Select offers available for a limited time'): US$10/seat/mo on monthly billing (monthly commitment) or US$7/seat/mo billed annually (US$84/yr). Sold as the Starter bundle (crm-suite-starter-bundle, includes 1,000 marketing contacts). India-served page: ₹585 annual / ₹835 monthly, list ₹1,670.

HubSpot Credits beyond the monthly limit: US$0.010 per credit (Pay-as-You-Go) or US$10 per 1,000-credit capacity pack

Sales Hub Professional

$100/mo

billed monthly

$90/mo

billed annually

Per seat; 3,000 HubSpot Credits.

API included
Plan details

US$100/seat/mo paid monthly (still an annual commitment: commitmentTerm ANNUAL, US$1,200/yr) or US$90/seat/mo paid annually (US$1,080/yr). Required one-time Professional Onboarding US$1,500. India-served page: ₹8,330 monthly / ₹7,497 annual.

HubSpot Credits: US$0.010 per credit or US$10 per 1,000-credit pack

Sales Hub Enterprise

$150/mo

annual billing only

$150/mo

billed annually

Per seat; 5,000 HubSpot Credits.

API included
Plan details

Annual term only, US$150/seat/mo (US$1,800/yr); Talk to Sales, no self-serve checkout. Required one-time Enterprise Onboarding US$3,500. India-served page: from ₹12,500/seat/mo.

HubSpot Credits: US$0.010 per credit or US$10 per 1,000-credit pack

Rate limits

Privately distributed apps: burst limit per app per 10 seconds, daily limit shared per account; resets at midnight in the account time zone.

LimitFree / Starter (any Hub)Professional (any Hub)Enterprise (any Hub)With API Limit Increase add-on (max 2 packs, US$500/month each)
Per 10s100 per app190 per app190 per app250 per app (developer docs and catalog intro text); catalog table: 350 / 600 (Free, Starter) or 440 / 690 (Pro, Ent) for 1 / 2 packs
Per Day250,000 per account625,000 per account (developer docs); 650,000 in the legal catalog1,000,000 per account+1,000,000 per pack, max two packs (does not apply to OAuth marketplace apps)
More on limitsLess

Marketplace-distributed OAuth apps: 110 requests per 10 seconds per installing account (excludes Search). CRM Search: 5 req/s per account. 429 errors should stay under 5% of daily requests. CONFLICT (recorded 2026-10-25): HubSpot's legal catalog (technical limits) lists Professional at 650,000/day (developer docs: 625,000) and says one API Limit Increase pack raises burst to 350 (Free/Starter) or 440 (Pro/Ent) per 10s and two packs to 600 / 690, while the same page's intro text and the developer docs say 250 per 10s. The developer docs are used for API behaviour; the catalog is the contract, so confirm with HubSpot before relying on either figure.

How to get an API key

HubSpot uses OAuth. The steps below follow HubSpot's own docs.

  1. Create a HubSpot account. API access starts on the Sales Hub Starter plan.
  2. OAuth for distributed apps; for single-account integrations a static auth token from an app on the developer platform, or a Service Key (Settings > Integrations > Service Keys). Legacy private-app creation is disabled for new accounts from 2026-09-28 and for existing accounts from 2026-10-26; existing private-app tokens keep working. Legacy private apps built before the Projects model must migrate by September 2027.
  3. Send it with every request: header: Authorization: Bearer <token>.
  4. Make a first call: Create-or-update up to 100 contacts by a unique property (idProperty, e.g. email). Keep the key in an environment variable, never in the command.
    curl -X POST "https://api.hubapi.com/crm/objects/2026-09/contacts/batch/upsert" \
      -H "Authorization: Bearer $HUBSPOT_ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{}'

Where the docs live

WhatWhere
Documentationdevelopers.hubspot.com/docs/index.md
API referencedevelopers.hubspot.com/docs/api-reference/latest/overview.md
OpenAPI specdevelopers.hubspot.com/docs/_llms/apis.txt
llms.txtdevelopers.hubspot.com/docs/llms.txt
Changelogdevelopers.hubspot.com/changelog
Base URLhttps://api.hubapi.com
MCP serverhttps://mcp.hubspot.com
SDKsNode.js: @hubspot/api-client (npm), PHP: hubspot/api-client (composer), Python: hubspot-api-client (pip), Ruby: hubspot-api-client (gem)

Strengths and limits

Where it fits

  • System of record for contacts/companies/deals when the client already runs HubSpot
  • Batch create/update/upsert of up to 100 records per call, with associations up to 2,000 per call
  • Bulk loads via the Imports API (up to 80,000,000 rows/day)
  • Agent read/write access through the official remote MCP server

Where it falls short

  • Deduping companies by domain on API writes: HubSpot does NOT dedupe API-created companies by domain
  • Deep paging through search results: search stops at 10,000 results per query
  • Rich workflow automation on Free/Starter: Free has no workflows, Starter gets up to 50 workflows with restricted triggers and actions; fully customizable workflows start at Professional (300) and Enterprise (1,000). Source: hubspot.com/pricing/sales (feature table, 2026-10-25)
  • Data enrichment or sourcing (it is a CRM, not a data provider)

Worth knowing

9 moreShow fewer

Our take

We upload companies and contacts into client HubSpot portals through the API. After one run created duplicate companies, our method is companies first, then contacts, with a domain-keyed index kept during the run because HubSpot's search lags behind newly created records, and a duplicate audit after every upload. HubSpot also creates a company on its own from a new contact's email domain, which is the most common source of duplicates we find.

Who should use it

Use HubSpot for
System of record for contacts/companies/deals when the client already runs HubSpot
Look elsewhere for
Deduping companies by domain on API writes: HubSpot does NOT dedupe API-created companies by domain

If HubSpot is not the answer

Other CRM tools in this directory, each with its own review.

Compare HubSpot with

Before you build

Four things to settle first, each read off HubSpot's own pages.

  • Confirm the API is on your planAPI access starts on the Sales Hub Starter plan. Free tier: Free tools: US$0, up to 2 users, no credit card.
  • Keep the key out of your codeOAuth. It is sent as: header: Authorization: Bearer <token>.
  • Design around the rate limitPrivately distributed apps: burst limit per app per 10 seconds, daily limit shared per account; resets at midnight in the account time zone.
  • Know the catch before you scaleCompanies created through the API are NOT deduplicated by domain (includes third-party sync apps). Source: knowledge.hubspot.com/records/deduplication-of-records

Want us to build it for you?

Tell us what you want HubSpot to do in your stack. We will show you how we would wire it into your data, outbound or CRM, and what we would check first.

Read from hubspot.com/pricing/sales, developers.hubspot.com/docs/api-reference/latest/overview.md and developers.hubspot.com/docs/developer-tooling/platform/usa. Verified 25 Oct 2026.

All 11 endpointsFor developers: method, path, what it does and what it costs.

Base URL: api.hubapi.com

Bulk and async: Batch endpoints 100 inputs/call; associations batch 2,000 create / 1,000 read; Imports API up to 80M rows/day; async Exports (30/day). Source: developers.hubspot.com/docs/api-reference/latest/crm/using-object-apis.md

Webhooks: Yes. App webhook subscriptions via /app-webhooks/2026-09/{appId}/subscriptions (max 1,000 per app; 400 beyond), each POST carries up to 100 events, X-HubSpot-Signature SHA-256, default concurrency 10 (maxConcurrentRequests must be > 5), retries up to 10 times spread over 24h, 5-second response timeout, settings cached up to 5 minutes. Workflow webhook actions: the usage guidelines name Marketing Hub Enterprise (other hubs not stated there); workflow webhook calls do not count against the API rate limit. Sources: developers.hubspot.com/docs/api-reference/latest/webhooks/guide.md; developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines.md (verified 2026-10-25)

11 endpoints
MethodPathWhat it doesCost
POST/crm/objects/2026-09/contacts/batch/upsertCreate-or-update up to 100 contacts by a unique property (idProperty, e.g. email)none (counts against API rate limit)
POST/crm/objects/2026-09/companies/batch/upsertCreate-or-update up to 100 companies by a unique propertynone
POST/crm/objects/2026-09/{objectType}/batch/{create|read|update|archive}Batch CRUD for contacts, companies, deals, tickets, custom objectsnone
POST/crm/objects/2026-09/{objectType}/searchFilter/sort/search CRM records (dedupe lookups)none
POST/crm/objects/2026-09/contacts/mergeMerge two contacts (irreversible; survivor may get a new id)none
POST/crm/associations/2026-09/{fromObjectType}/{toObjectType}/batch/associate/defaultBulk-associate records with the default (unlabeled) associationnone
POST/crm/associations/2026-09/{fromObjectType}/{toObjectType}/batch/readRead associations for up to 1,000 recordsnone
POSTasync/crm/imports/2026-09Bulk CSV/XLSX import of records with associationsnone
POSTasync/crm/exports/2026-09/export/asyncAsync export of records or viewsnone
POST/crm/lists/2026-09/Create static (MANUAL) or dynamic lists; manage membershipsnone
GET/app-webhooks/2026-09/{appId}/subscriptionsManage webhook event subscriptions for an appnone