HubSpot by altf1be
/install hubspot-by-altf1be
HubSpot by @altf1be
Full HubSpot platform CLI covering CRM, CMS, Marketing, Conversations, and Automation.
Setup
- Create a Private App in HubSpot: Settings > Integrations > Private Apps
- Set environment variables (or create
.envin{baseDir}):
# Required (Private App mode)
HUBSPOT_ACCESS_TOKEN=pat-na1-xxxxxxxx
# OR use OAuth 2.0 mode (set all three):
# HUBSPOT_CLIENT_ID=your-client-id
# HUBSPOT_CLIENT_SECRET=your-client-secret
# HUBSPOT_REFRESH_TOKEN=your-refresh-token
# Optional
# HUBSPOT_MAX_RESULTS=100
- Configure the required Private App scopes in HubSpot (Settings > Integrations > Private Apps > your app > Scopes):
| Scope | Description |
|---|---|
crm.objects.contacts.read |
View properties and other details about contacts |
crm.objects.contacts.write |
Create, delete, or make changes to contacts |
crm.objects.companies.read |
View properties and other details about companies |
crm.objects.companies.write |
Create, delete, or make changes to companies |
crm.objects.deals.read |
View properties and other details about deals |
crm.objects.deals.write |
Create, delete, or make changes to deals |
crm.objects.owners.read |
View details about users assigned to a CRM record |
crm.schemas.contacts.read |
View details about property settings for contacts |
crm.schemas.companies.read |
View details about property settings for companies |
crm.schemas.deals.read |
View details about property settings for deals |
tickets |
View, create, delete, or make changes to tickets |
automation |
Workflows |
content |
Sites, landing pages, CTA, email, blog, campaigns |
conversations.read |
View messages, comments, threads, recipient/user/assignment details |
forms |
Access to the Forms API |
- Install dependencies:
cd {baseDir} && npm install
Commands
CRM — Contacts
# List contacts
node {baseDir}/scripts/hubspot.mjs contacts list
# Search contacts by email
node {baseDir}/scripts/hubspot.mjs contacts search --query "[email protected]"
# Read contact details
node {baseDir}/scripts/hubspot.mjs contacts read --id 123
# Create a contact
node {baseDir}/scripts/hubspot.mjs contacts create --email "[email protected]" --firstname Jane --lastname Doe
# Update a contact
node {baseDir}/scripts/hubspot.mjs contacts update --id 123 --phone "+1234567890"
# Delete a contact (requires --confirm)
node {baseDir}/scripts/hubspot.mjs contacts delete --id 123 --confirm
CRM — Companies
node {baseDir}/scripts/hubspot.mjs companies list
node {baseDir}/scripts/hubspot.mjs companies search --query "Acme"
node {baseDir}/scripts/hubspot.mjs companies read --id 456
node {baseDir}/scripts/hubspot.mjs companies create --name "Acme Corp" --domain "acme.com"
node {baseDir}/scripts/hubspot.mjs companies update --id 456 --industry "Technology"
node {baseDir}/scripts/hubspot.mjs companies delete --id 456 --confirm
CRM — Deals
node {baseDir}/scripts/hubspot.mjs deals list
node {baseDir}/scripts/hubspot.mjs deals search --query "Enterprise"
node {baseDir}/scripts/hubspot.mjs deals read --id 789
node {baseDir}/scripts/hubspot.mjs deals create --name "Big Deal" --amount 50000 --stage appointmentscheduled
node {baseDir}/scripts/hubspot.mjs deals update --id 789 --stage closedwon
node {baseDir}/scripts/hubspot.mjs deals delete --id 789 --confirm
CRM — Tickets
node {baseDir}/scripts/hubspot.mjs tickets list
node {baseDir}/scripts/hubspot.mjs tickets search --query "Bug"
node {baseDir}/scripts/hubspot.mjs tickets read --id 101
node {baseDir}/scripts/hubspot.mjs tickets create --subject "Login broken" --priority HIGH
node {baseDir}/scripts/hubspot.mjs tickets update --id 101 --stage 2
node {baseDir}/scripts/hubspot.mjs tickets delete --id 101 --confirm
CRM — Owners
node {baseDir}/scripts/hubspot.mjs owners list
node {baseDir}/scripts/hubspot.mjs owners list --email "[email protected]"
node {baseDir}/scripts/hubspot.mjs owners read --id 55
CRM — Pipelines
# List deal pipelines (default)
node {baseDir}/scripts/hubspot.mjs pipelines list
# List ticket pipelines
node {baseDir}/scripts/hubspot.mjs pipelines list --object-type tickets
CRM — Associations (v4)
# List associations from contact to companies
node {baseDir}/scripts/hubspot.mjs associations list --from-type contacts --from-id 123 --to-type companies
# Create an association
node {baseDir}/scripts/hubspot.mjs associations create --from-type contacts --from-id 123 --to-type companies --to-id 456 --type-id 1
# Delete an association (requires --confirm)
node {baseDir}/scripts/hubspot.mjs associations delete --from-type contacts --from-id 123 --to-type companies --to-id 456 --confirm
CRM — Properties
# List contact properties (default)
node {baseDir}/scripts/hubspot.mjs properties list
# List deal properties
node {baseDir}/scripts/hubspot.mjs properties list --object-type deals
CRM — Engagements
node {baseDir}/scripts/hubspot.mjs engagements notes
node {baseDir}/scripts/hubspot.mjs engagements emails
node {baseDir}/scripts/hubspot.mjs engagements calls
node {baseDir}/scripts/hubspot.mjs engagements tasks
node {baseDir}/scripts/hubspot.mjs engagements meetings
CMS — Blog Posts
node {baseDir}/scripts/hubspot.mjs blog-posts list
node {baseDir}/scripts/hubspot.mjs blog-posts list --state PUBLISHED
node {baseDir}/scripts/hubspot.mjs blog-posts read --id 1001
node {baseDir}/scripts/hubspot.mjs blog-posts create --name "My Post"
node {baseDir}/scripts/hubspot.mjs blog-posts update --id 1001 --name "Updated Title"
CMS — Pages
node {baseDir}/scripts/hubspot.mjs pages list
node {baseDir}/scripts/hubspot.mjs pages read --id 2001
CMS — Domains
node {baseDir}/scripts/hubspot.mjs domains list
Marketing — Email Campaigns
node {baseDir}/scripts/hubspot.mjs email-campaigns list
node {baseDir}/scripts/hubspot.mjs email-campaigns read --id 3001
Marketing — Forms
node {baseDir}/scripts/hubspot.mjs forms list
node {baseDir}/scripts/hubspot.mjs forms read --id 4001
Marketing — Marketing Emails
node {baseDir}/scripts/hubspot.mjs marketing-emails list
node {baseDir}/scripts/hubspot.mjs marketing-emails read --id 5001
node {baseDir}/scripts/hubspot.mjs marketing-emails stats --id 5001
Marketing — Contact Lists
node {baseDir}/scripts/hubspot.mjs lists list
node {baseDir}/scripts/hubspot.mjs lists read --id 6001
Conversations
node {baseDir}/scripts/hubspot.mjs conversations list
node {baseDir}/scripts/hubspot.mjs conversations read --id 7001
node {baseDir}/scripts/hubspot.mjs messages list --thread-id 7001
Automation — Workflows
node {baseDir}/scripts/hubspot.mjs workflows list
node {baseDir}/scripts/hubspot.mjs workflows read --id 8001
Security
- Auth method: Bearer token (Private App) or OAuth 2.0 with auto-refresh
- No secrets or tokens printed to stdout
- All delete operations require explicit
--confirmflag - Built-in rate limiting with exponential backoff retry (3 attempts)
- OAuth tokens cached in
~/.cache/openclaw/hubspot-token.json - Lazy config validation (only checked when a command runs)
Dependencies
commander— CLI frameworkdotenv— environment variable loading- Node.js built-in
fetch(requires Node >= 18)
Author
Abdelkrim BOUJRAF — ALT-F1 SRL, Brussels 🇧🇪 🇲🇦 X: @altf1be
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install hubspot-by-altf1be - After installation, invoke the skill by name or use
/hubspot-by-altf1be - Provide required inputs per the skill's parameter spec and get structured output
What is HubSpot by altf1be?
Full HubSpot platform CLI — CRM contacts/companies/deals/tickets, CMS blog posts/pages, Marketing emails/forms/lists, Conversations, Automation workflows. Pr... It is an AI Agent Skill for Claude Code / OpenClaw, with 160 downloads so far.
How do I install HubSpot by altf1be?
Run "/install hubspot-by-altf1be" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is HubSpot by altf1be free?
Yes, HubSpot by altf1be is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does HubSpot by altf1be support?
HubSpot by altf1be is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created HubSpot by altf1be?
It is built and maintained by Abdelkrim from Brussels (@abdelkrim); the current version is v1.0.1.