From hubspot-pack
Install and configure HubSpot API client with authentication. Use when setting up a new HubSpot integration, configuring private app tokens, OAuth 2.0 flows, or initializing the @hubspot/api-client SDK. Trigger with phrases like "install hubspot", "setup hubspot auth", "hubspot access token", "configure hubspot API", "hubspot private app".
npx claudepluginhub flight505/skill-forge --plugin hubspot-packThis skill is limited to using the following tools:
Set up the `@hubspot/api-client` SDK and configure authentication using private app access tokens or OAuth 2.0.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Set up the @hubspot/api-client SDK and configure authentication using private app access tokens or OAuth 2.0.
# Node.js (official SDK)
npm install @hubspot/api-client
# Python
pip install hubspot-api-client
crm.objects.contacts.read / crm.objects.contacts.writecrm.objects.companies.read / crm.objects.companies.writecrm.objects.deals.read / crm.objects.deals.writecrm.objects.custom.read / crm.objects.custom.writecrm.schemas.contacts.read (for properties)# .env file (add to .gitignore)
HUBSPOT_ACCESS_TOKEN=pat-na1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# .gitignore
echo '.env' >> .gitignore
echo '.env.local' >> .gitignore
import * as hubspot from '@hubspot/api-client';
const hubspotClient = new hubspot.Client({
accessToken: process.env.HUBSPOT_ACCESS_TOKEN,
});
// Verify connection by fetching account info
async function verifyConnection() {
try {
const response = await hubspotClient.crm.contacts.basicApi.getPage(
1, // limit
undefined, // after
['firstname', 'lastname', 'email']
);
console.log(`Connected. Found ${response.results.length} contact(s).`);
return true;
} catch (error) {
if (error.code === 401) {
console.error('Invalid access token. Check HUBSPOT_ACCESS_TOKEN.');
} else if (error.code === 403) {
console.error('Missing scopes. Add crm.objects.contacts.read to your private app.');
} else {
console.error('Connection failed:', error.message);
}
return false;
}
}
// For public apps distributed to multiple HubSpot portals
const hubspotClient = new hubspot.Client();
// Step 1: Generate authorization URL
const authUrl = hubspotClient.oauth.getAuthorizationUrl(
'your-client-id',
'http://localhost:3000/oauth/callback',
'crm.objects.contacts.read crm.objects.contacts.write'
);
// Redirect user to authUrl
// Step 2: Exchange code for tokens (in callback handler)
const tokenResponse = await hubspotClient.oauth.tokensApi.create(
'authorization_code',
code, // from query param
redirectUri,
clientId,
clientSecret
);
// Step 3: Initialize client with OAuth token
const authedClient = new hubspot.Client({
accessToken: tokenResponse.accessToken,
});
// Step 4: Refresh tokens before expiry (tokens expire in 30 minutes)
const refreshResponse = await hubspotClient.oauth.tokensApi.create(
'refresh_token',
undefined,
undefined,
clientId,
clientSecret,
refreshToken
);
@hubspot/api-client installed in node_modules.env file with HUBSPOT_ACCESS_TOKEN| Error | Code | Cause | Solution |
|---|---|---|---|
401 Unauthorized | 401 | Invalid or expired token | Regenerate token in Private Apps settings |
403 Forbidden | 403 | Missing required scopes | Add scopes and generate new token |
429 Too Many Requests | 429 | Rate limit exceeded | Implement backoff (see hubspot-rate-limits) |
MODULE_NOT_FOUND | -- | Package not installed | Run npm install @hubspot/api-client |
ECONNREFUSED | -- | Network blocked | Ensure outbound HTTPS to api.hubapi.com |
from hubspot import HubSpot
client = HubSpot(access_token=os.environ.get('HUBSPOT_ACCESS_TOKEN'))
# Verify connection
try:
contacts = client.crm.contacts.basic_api.get_page(limit=1)
print(f"Connected. Found {len(contacts.results)} contact(s).")
except Exception as e:
print(f"Connection failed: {e}")
import * as hubspot from '@hubspot/api-client';
import type {
SimplePublicObjectWithAssociations
} from '@hubspot/api-client/lib/codegen/crm/contacts';
const client = new hubspot.Client({
accessToken: process.env.HUBSPOT_ACCESS_TOKEN!,
numberOfApiCallRetries: 3, // built-in retry support
});
After successful auth, proceed to hubspot-hello-world for your first CRM operations.