skills/hubspot/SKILL.md
Manage HubSpot CRM contacts, companies, deals, and CMS content via API. Use when the user says "add contact to HubSpot", "create deal", "search CRM", "HubSpot contacts", "update deal stage", "CRM report", "HubSpot pages", or asks about managing their sales pipeline, CRM data, or HubSpot content.
npx skillsauth add OpenClaudia/openclaudia-skills hubspotInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a HubSpot CRM and CMS automation expert. Use the HubSpot API to manage contacts, companies, deals, owners, associations, properties, CMS pages, and files.
This skill requires HUBSPOT_ACCESS_TOKEN (Private App token). Check for it in environment variables or ~/.claude/.env.global. If not found, inform the user:
This skill requires a HubSpot Private App access token. Set it via:
export HUBSPOT_ACCESS_TOKEN=your_token_here
Or add it to ~/.claude/.env.global
Create a Private App at: Settings > Integrations > Private Apps
Required scopes: crm.objects.contacts, crm.objects.companies, crm.objects.deals, content
Base URL: https://api.hubapi.com
Auth header: Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}
Rate limit: 100 requests per 10 seconds for private apps.
List contacts:
curl -s "https://api.hubapi.com/crm/v3/objects/contacts?limit=10&properties=firstname,lastname,email,company,phone" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
Search contacts:
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/contacts/search" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"filterGroups": [{
"filters": [{
"propertyName": "email",
"operator": "CONTAINS_TOKEN",
"value": "example.com"
}]
}],
"properties": ["firstname", "lastname", "email", "company"],
"limit": 10
}'
Create contact:
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/contacts" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"properties": {
"firstname": "John",
"lastname": "Doe",
"email": "[email protected]",
"company": "Acme Inc",
"phone": "+1234567890"
}
}'
Get contact by email:
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/contacts/search" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"filterGroups": [{
"filters": [{
"propertyName": "email",
"operator": "EQ",
"value": "[email protected]"
}]
}],
"properties": ["firstname", "lastname", "email", "company", "phone", "lifecyclestage"]
}'
List companies:
curl -s "https://api.hubapi.com/crm/v3/objects/companies?limit=10&properties=name,domain,industry,numberofemployees" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
Search companies by domain:
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/companies/search" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"filterGroups": [{
"filters": [{
"propertyName": "domain",
"operator": "EQ",
"value": "example.com"
}]
}],
"properties": ["name", "domain", "industry", "numberofemployees", "annualrevenue"]
}'
Create deal:
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/deals" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"properties": {
"dealname": "New Enterprise Deal",
"dealstage": "appointmentscheduled",
"pipeline": "default",
"amount": "50000",
"closedate": "2026-06-30"
}
}'
List deals:
curl -s "https://api.hubapi.com/crm/v3/objects/deals?limit=10&properties=dealname,dealstage,amount,closedate,pipeline" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
Update deal stage:
curl -s -X PATCH "https://api.hubapi.com/crm/v3/objects/deals/{dealId}" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"properties": {"dealstage": "closedwon"}}'
List owners (sales reps):
curl -s "https://api.hubapi.com/crm/v3/owners/" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
Associate contacts with companies or deals:
# Associate deal with contact (type 3)
curl -s -X PUT "https://api.hubapi.com/crm/v3/objects/deals/{dealId}/associations/contacts/{contactId}/3" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
# Associate deal with company (type 5)
curl -s -X PUT "https://api.hubapi.com/crm/v3/objects/deals/{dealId}/associations/companies/{companyId}/5" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
# Associate contact with company (type 1)
curl -s -X PUT "https://api.hubapi.com/crm/v3/objects/contacts/{contactId}/associations/companies/{companyId}/1" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
Get associated contacts for a deal:
curl -s "https://api.hubapi.com/crm/v3/objects/deals/{dealId}/associations/contacts" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
List all contact properties:
curl -s "https://api.hubapi.com/crm/v3/properties/contacts" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
List site pages:
curl -s "https://api.hubapi.com/cms/v3/pages/site-pages?limit=10" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
List landing pages:
curl -s "https://api.hubapi.com/cms/v3/pages/landing-pages?limit=10" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
| Operator | Description |
|----------|-------------|
| EQ | Equal to |
| NEQ | Not equal to |
| LT / LTE | Less than / Less than or equal |
| GT / GTE | Greater than / Greater than or equal |
| CONTAINS_TOKEN | Contains word |
| NOT_CONTAINS_TOKEN | Does not contain word |
| HAS_PROPERTY | Property exists |
| NOT_HAS_PROPERTY | Property does not exist |
All list endpoints support pagination via the after parameter:
curl -s "https://api.hubapi.com/crm/v3/objects/contacts?limit=100&after={next_cursor}" \
-H "Authorization: Bearer ${HUBSPOT_ACCESS_TOKEN}"
The after value comes from paging.next.after in the response.
dealstage, amount, closedateNOT_HAS_PROPERTY)firstname, dealstage, closedate).data-ai
Generate images using AI (OpenAI GPT Image or Stability AI). Use when the user asks to generate an image, create an AI image, make an illustration, or produce artwork from a text prompt.
development
Fetch website traffic estimates (monthly visits, traffic sources, top countries, keywords, engagement, ranks) for any domain from SimilarWeb. Use when the user asks about a domain's traffic, monthly visits, traffic sources, audience countries, or wants to compare/benchmark sites against competitors.
development
Find which ChatGPT search queries mention a given brand. Tests long-tail queries against ChatGPT's web-search-enabled model and reports which ones surface the brand. Use when the user asks to "find queries for [brand]", "check GEO visibility", "which queries mention [brand]", "geo query finder", "find AI mentions", or "test ChatGPT queries for [brand]".
testing
Edit podcast audio — trim pre/post-show chat, remove filler words, cut silences, and enhance audio quality. Use when the user asks to edit a podcast, clean up audio, remove fillers, trim a recording, or improve voice quality.