HubSpot’s API v3 is one of the most mature CRM + marketing APIs in the industry. Wide surface across contacts, companies, deals, tickets, marketing emails, workflows, and lists. OAuth 2.0 + private app tokens, well-documented per-portal rate limits (100 requests per 10 seconds standard tier, higher for Enterprise), 7 official SDKs. In 2026 HubSpot added a major differentiator: an official remote MCP server for AI agents, letting Claude Desktop, Cursor, VSCode, and ChatGPT operate the HubSpot CRM through natural language. This tab inventories the API surface, MCP capabilities, and the gotchas developers need to evaluate before committing.
Model Context Protocol is the standard for connecting LLM agents to external tools. HubSpot’s MCP server was released with unusually wide CRM coverage from launch, positioning HubSpot as one of the AI-agent-first CRM platforms in 2026.
The HubSpot Remote MCP Server is officially maintained by HubSpot and hosted at HubSpot’s MCP endpoint. Wide CRM coverage from launch: contacts, companies, deals, tickets, marketing emails, workflows, lists, activities. HTTP transport (aligned with the MCP 2026-07-28 spec). Compatible with Claude Desktop, Claude Code, Cursor, VSCode, and ChatGPT (Pro/Plus with developer mode). Enterprise-focused authentication via OAuth 2.0 with granular scope management. Documented at developers.hubspot.com.
Three ways to reach HubSpot from an AI agent as of August 2026. The first is HubSpot’s official remote server — the most feature-complete option.
First-party MCP server, hosted at HubSpot’s MCP endpoint. Wide CRM coverage: contacts, companies, deals, tickets, marketing emails, workflows, lists. OAuth 2.0 authentication with granular scopes.
Popular community MCP server with built-in vector storage and caching to overcome HubSpot API rate limits. Useful for high-frequency AI-agent queries against contact and deal data.
Bridge access via Zapier’s MCP layer. Useful if you already run Zapier and want unified MCP surface. Each MCP tool call consumes Zapier task credits.
HubSpot API v3 is REST-based with JSON payloads. Endpoint paths follow object-oriented conventions (/crm/v3/objects/{objectType}). Both v3 and legacy v1 endpoints remain supported for backward compatibility.
| Base URL | https://api.hubapi.com |
|---|---|
| Response format | JSON |
| Authentication | OAuth 2.0 (public apps) or Private App tokens (in-account) |
| Standard rate limit | 100 requests per 10 seconds per portal |
| Enterprise rate limit | 200 requests per 10 seconds per portal |
| Daily quota (Free/Starter) | 250,000 requests/day |
| Daily quota (Pro/Enterprise) | 500,000-1,000,000 requests/day |
| Pagination | Cursor-based via paging.next.after |
| Response on rate exceed | HTTP 429 with Retry-After header |
| Batch operations | Batch endpoints for contacts, companies, deals (up to 100 records per batch) |
The 100-requests-per-10-seconds rule is the number one thing developers underestimate. At standard tier, you can burst 100 requests in 1 second but not another 100 for the next 9 seconds. Design your request patterns around this rolling window — batch endpoints are essential for any bulk operation.
Generate a private app in your HubSpot portal at Settings › Integrations › Private Apps. Assign granular scopes at creation. Use the resulting access token in the Authorization header:
Authorization: Bearer pat-XXXXXXXXXXXXXXXX Content-Type: application/json
Private app tokens are the recommended pattern for internal integrations (custom apps, data pipelines, admin scripts). Scoped per app, revocable per app, no OAuth flow complexity.
Required for apps published on the HubSpot App Marketplace or for any integration that acts on behalf of multiple HubSpot users. Standard three-leg authorization code flow. Register your app in the HubSpot Developer Portal to receive Client ID + Client Secret. Access tokens expire after 30 minutes; refresh tokens are long-lived.
crm.objects.contacts.read, crm.objects.deals.write, content). Unlike Mailchimp or Postmark (all-or-nothing tokens), HubSpot lets you create tokens with only the exact permissions needed. Use this for third-party integrations to minimize blast radius of a leaked token.HubSpot publishes rate limits per portal (customer account), with tier-based scaling. Understanding the 100/10s rule is essential for any non-trivial integration.
| Limit type | Standard tier | Enterprise tier |
|---|---|---|
| Requests per 10 seconds | 100 | 200 |
| Requests per day (Free / Starter) | 250,000 | N/A |
| Requests per day (Pro / Enterprise) | 500,000+ | 1,000,000+ |
| Search API (special limit) | 5 requests per second per portal | Same — not increased on Enterprise |
| Batch endpoints | Up to 100 records per batch | Same — use to reduce request count |
| Response on exceed | HTTP 429 with Retry-After header | Same — implement exponential backoff |
The 100/10s per portal is portal-wide — shared across all API keys, private apps, and integrations accessing your HubSpot portal. If you run Zapier + a custom sync app + an OAuth integration simultaneously, they compete for the same 100/10s budget. Coordinate integration timing to avoid mutual throttling.
/crm/v3/objects/{objectType}/search endpoints have their own 5 requests per second per portal ceiling — NOT increased on Enterprise. If you build heavy search-based workflows (e.g., “find all contacts matching X”), plan carefully or use batch reads with client-side filtering instead.Seven official client libraries maintained by HubSpot, plus TypeScript type definitions.
| Language | Package | Install | Repo |
|---|---|---|---|
| Node.js | @hubspot/api-client | npm install | GitHub |
| Python | hubspot-api-client | pip install | GitHub |
| PHP | hubspot/api-client | composer require | GitHub |
| Ruby | hubspot-api-client | gem install | GitHub |
| .NET | HubSpot.NET | Install-Package | GitHub |
| Java | hubspot-api-client | Maven / Gradle | GitHub |
| TypeScript | Included in @hubspot/api-client | npm install | Same repo as Node.js |
The endpoint groups you will actually use in production. Full reference at developers.hubspot.com/docs/api/overview.
| Resource | HTTP methods | Description |
|---|---|---|
| Contacts /crm/v3/objects/contacts | GET, POST, PATCH, DELETE | Full CRUD on contacts. Batch endpoints for up to 100 records at once. |
| Companies /crm/v3/objects/companies | GET, POST, PATCH, DELETE | B2B account management. Associations to contacts, deals, tickets. |
| Deals /crm/v3/objects/deals | GET, POST, PATCH, DELETE | Sales pipeline management. Stage transitions, forecasting. |
| Tickets /crm/v3/objects/tickets | GET, POST, PATCH, DELETE | Service Hub tickets. Status transitions, agent assignments. |
| Custom objects /crm/v3/objects/{customType} | GET, POST, PATCH, DELETE | Enterprise-only. Model any custom entity (subscriptions, memberships, etc.) with same CRUD semantics. |
| Marketing emails /marketing/v3/emails | GET, POST, PATCH, DELETE | Marketing Hub emails. CRUD + schedule + cancel + reports. |
| Transactional emails /marketing/v3/transactional/single-email/send | POST | Send single transactional email (requires Transactional Email add-on). |
| Workflows /automation/v4/flows | GET, POST, PATCH, DELETE | Marketing + sales workflow automation. Enrollment triggers, branching logic. |
| Lists /crm/v3/lists | GET, POST, DELETE | Static + dynamic contact lists. Manage memberships. |
| Forms /marketing/v3/forms | GET, POST, PATCH | HubSpot Forms CRUD. Form submissions handled via separate submissions endpoint. |
| Files /files/v3/files | GET, POST, DELETE | File manager for images, attachments used in marketing content. |
| Webhooks /webhooks/v3/subscriptions | GET, POST, PATCH, DELETE | Configure webhook subscriptions for object + property changes across the platform. |
const hubspot = require('@hubspot/api-client');
const client = new hubspot.Client({
accessToken: 'pat-YOUR_PRIVATE_APP_TOKEN'
});
async function upsertContact(email) {
try {
// Try to find existing contact by email
const found = await client.crm.contacts.searchApi.doSearch({
filterGroups: [{
filters: [{ propertyName: 'email', operator: 'EQ', value: email }]
}]
});
if (found.results.length > 0) {
const id = found.results[0].id;
await client.crm.contacts.basicApi.update(id, {
properties: { firstname: 'Alaa', lastname: 'Touil' }
});
console.log(`Updated contact ${id}`);
} else {
const created = await client.crm.contacts.basicApi.create({
properties: { email, firstname: 'Alaa', lastname: 'Touil' }
});
console.log(`Created contact ${created.id}`);
}
} catch (err) {
console.error(err.message);
}
}
upsertContact('user@example.com');from hubspot import HubSpot
from hubspot.marketing.transactional import PublicSingleSendRequestEgg
client = HubSpot(access_token='pat-YOUR_PRIVATE_APP_TOKEN')
request = PublicSingleSendRequestEgg(
email_id=123456, # Transactional email template ID
message={
'to': 'customer@example.com',
'from': 'sender@yourbrand.com',
'reply_to': ['support@yourbrand.com']
},
contact_properties={'firstname': 'Alaa'},
custom_properties={'order_id': 'ORD-1234'}
)
response = client.marketing.transactional.single_send_api.send_email(
public_single_send_request_egg=request
)
print(f"Sent: {response.status_id}")The rate limit is shared across ALL integrations accessing your portal (Zapier + custom apps + OAuth integrations + private apps). If Zapier is running a busy workflow while you try to run a data sync, they compete for the same 100/10s budget. Coordinate integration timing.
The /search endpoints on any CRM object are rate-limited at 5 requests per second per portal, NOT 100/10s. This limit is NOT raised on Enterprise. Building heavy search-based workflows requires client-side filtering with batch reads instead of many search calls.
The /marketing/v3/transactional/single-email/send endpoint returns a 403 error if you have not purchased the Transactional Email add-on. See our SMTP Settings tab for add-on requirements and pricing.
The custom objects API (/crm/v3/objects/{customType}) is available only on Enterprise Hubs. Free, Starter, and Professional Hubs can only use standard objects (contacts, companies, deals, tickets). Plan around this if your data model requires custom entities.
HubSpot has both v1 legacy endpoints and v3 modern endpoints in active use. Some functionality is only in v1 (older webhook types) or only in v3 (custom objects). Always check the endpoint documentation to confirm which version supports your operation, and prefer v3 for new development.
HubSpot maintains developer changelogs at developers.hubspot.com/changelog. Key items:
Yes. The HubSpot Remote MCP Server is officially maintained by HubSpot and hosted at HubSpot’s MCP endpoint. Generally Available in 2026. Wide CRM coverage: contacts, companies, deals, tickets, marketing emails, workflows, lists. HTTP transport aligned with MCP 2026-07-28 spec. Compatible with Claude Desktop, Claude Code, Cursor, VSCode, ChatGPT Pro/Plus. Documented at developers.hubspot.com.
Seven officially maintained SDKs: Node.js/TypeScript, Python, PHP, Ruby, .NET, Java, plus TypeScript type definitions included in the Node.js package. All maintained by HubSpot and updated as new API versions ship.
100 requests per 10 seconds per portal on standard tier, 200/10s on Enterprise. Daily quotas: 250K/day (Free/Starter), 500K-1M/day (Pro/Enterprise). Search API has its own separate 5 requests per second ceiling that is NOT raised on Enterprise. All limits are per-portal and shared across all integrations.
Two options. Private app tokens (recommended for internal use): generate in Settings › Integrations › Private Apps, assign granular scopes, use as Bearer token. OAuth 2.0 (required for public apps): standard three-leg flow with 30-minute access tokens and long-lived refresh tokens. Both support granular scopes — a strong feature vs Mailchimp or Postmark all-or-nothing tokens.
Private app tokens are for internal integrations within one HubSpot portal — no OAuth flow, simpler setup, assigned to one portal. OAuth 2.0 is required for public apps (App Marketplace listings) or any integration acting on behalf of multiple HubSpot customers — requires app registration in Developer Portal, three-leg authorization flow, token refresh handling. Both support granular scopes.
Yes, via the /marketing/v3/transactional/single-email/send endpoint — but ONLY if you have purchased the Transactional Email add-on. Without the add-on, the endpoint returns 403. See our SMTP Settings tab for add-on details and pricing.
No. HubSpot deprecated the legacy single API key authentication in November 2022. All new integrations must use private app tokens (for internal use) or OAuth 2.0 (for public apps). If you still have integrations using API keys, migrate immediately — they will stop working per HubSpot’s shutoff timeline.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.