Overview
The HubSpot tools integrate with the HubSpot CRM API to manage contacts and read deals from your workflows. The contact tools key on the email address, so you can reconcile records without going through the Search API and its rate limit. The deal tools fetch a deal by ID or search deals by name, stage, owner, close or creation date, or any other property. The company and owner tools resolve the IDs a deal carries (its associated company, itshubspot_owner_id) into names, domains, and email addresses, and the note and task tools attach engagements to a deal without modifying the deal itself.
Key Features
HUBSPOT_UPSERT_CONTACT- Create a contact, or update the existing one with the same email address. Supports custom properties.
HUBSPOT_GET_CONTACT- Fetch a contact by object ID or by email address. Returns
found: falseinstead of failing when no contact matches.
- Fetch a contact by object ID or by email address. Returns
HUBSPOT_GET_DEAL- Fetch a deal by object ID, optionally with associated contact and company IDs. Returns
found: falseinstead of failing when no deal matches.
- Fetch a deal by object ID, optionally with associated contact and company IDs. Returns
HUBSPOT_SEARCH_DEALS- Search deals by name, stage, pipeline, owner, or close / creation date range, with free-text and custom property filters. Paged.
HUBSPOT_GET_COMPANY- Fetch a company by object ID, optionally with associated contact and deal IDs. Returns
found: falseinstead of failing when no company matches.
- Fetch a company by object ID, optionally with associated contact and deal IDs. Returns
HUBSPOT_GET_OWNER- Fetch an owner by owner ID or by email address, returning their name, email, and user ID. Returns
found: falseinstead of failing when no owner matches.
- Fetch an owner by owner ID or by email address, returning their name, email, and user ID. Returns
HUBSPOT_LIST_OWNERS- List the owners in the account, optionally filtered by email or limited to archived owners. Paged.
HUBSPOT_CREATE_NOTE- Create a note and attach it to a deal, contact, or company, with an optional timestamp and author.
HUBSPOT_CREATE_TASK- Create a task with a due date, status, priority, and assignee, and attach it to a deal, contact, or company.
Authentication
For setup instructions, see the HubSpot credentials page.Example: Look Up a Contact, Then Create or Update It
Example: List Deals Closing This Month for One Owner
Example: Resolve a New Deal’s Owner and Company
Example: Log a Meeting Summary and a Follow-up Task on a Deal
Inputs
HUBSPOT_UPSERT_CONTACT
A named input left blank is skipped, not sent — HubSpot reads an empty string as “clear this property”, so clearing has to be asked for explicitly through
properties ({"firstname": null}). Named inputs win over the same key inside properties. Setting properties.email to something other than the email input is rejected. A difference in letter case alone is treated as the same address.
Returns result.id, result.created, result.properties, and the raw result.contact.
HUBSPOT_GET_CONTACT
Returns
result.found, result.id, result.properties, result.associations, and the raw result.contact.
HUBSPOT_GET_DEAL
Returns
result.found, result.id, result.properties, result.associations, and the raw result.deal.
HUBSPOT_SEARCH_DEALS
All inputs are optional. Named filters are combined with AND.
Returns
result.deals (each with id and properties), result.count, result.total, and result.next_after (null on the last page).
HUBSPOT_GET_COMPANY
Returns
result.found, result.id, result.properties, result.associations, and the raw result.company.
HUBSPOT_GET_OWNER
Returns
result.found, result.id, result.email, result.first_name, result.last_name, result.user_id, result.archived, and the raw result.owner.
HUBSPOT_LIST_OWNERS
All inputs are optional.
Returns
result.owners (each with id, email, first_name, last_name, user_id, and archived), result.count, and result.next_after (null on the last page).
HUBSPOT_CREATE_NOTE
Returns
result.id, result.properties, and the raw result.note.
HUBSPOT_CREATE_TASK
Returns
result.id, result.properties, and the raw result.task.
Notes
- Not found is not an error:
HUBSPOT_GET_CONTACT,HUBSPOT_GET_DEAL,HUBSPOT_GET_COMPANY, andHUBSPOT_GET_OWNERreturnresult.found = falseon a missing record, so “look up, and create it if missing” can be an ordinary condition step. - Notes and tasks do not edit the deal: engagements are separate records associated with the deal, contact, or company you pass. None of the deal’s own fields are written; HubSpot only refreshes its activity-derived properties (such as last activity date), which any workflow keyed on those will see. The Engagements API documents
crm.objects.contacts.writefor creating them, notcrm.objects.deals.write. - Engagement timestamps:
timestampanddue_dateaccept ISO 8601 or epoch milliseconds. A date without a time is read as midnight UTC, so pass an explicit time with an offset (2026-10-08T09:00:00+09:00) when the hour matters. - Creates are not retried by the tool: the HTTP call behind a note or task create is never repeated by the tool itself, whatever the failure, because a repeat could create the record twice. A step-level
retryyou configure still re-runs the step after a definitive rejection such as a 429, but the step opts out of it when the failure is ambiguous (the request timed out inside the tool, the connection dropped, or HubSpot answered 5xx). One gap remains: a step-leveltimeoutthat fires mid-request is raised by the runner, not the tool, so it is retried like any other error — keepretryoff such steps, or set the step timeout well above the tool’s own 30 seconds. Check HubSpot for the record before re-running the step. - Owner IDs vs user IDs:
hubspot_owner_idis not the user ID shown under Settings → Users. UseHUBSPOT_GET_OWNERto turn an owner ID into a name and email address, orHUBSPOT_LIST_OWNERSto find the owner ID for a given person. - Search limits: HubSpot allows at most 6 filters per search (named fields and
filtersentries combined), returns at most 200 deals per page and 10,000 per query, and rate-limits the Search API separately at 5 requests per second per account. The search index can lag a few seconds behind writes, so a deal created moments earlier may not appear yet. - Date properties:
closedateandcreatedateare date-times in HubSpot. The range inputs are converted to epoch milliseconds for you; values infiltersare sent as-is, so prefer epoch milliseconds there. - Incremental pickup:
create_date_fromis inclusive (>=). If you pass thecreatedateof the newest deal from the previous run, that deal is returned again, so de-duplicate byiddownstream. - Concurrent writes are last-write-wins: HubSpot’s CRM API has no optimistic locking, so overlapping updates resolve per property. Do not use
HUBSPOT_UPSERT_CONTACTfor read-modify-write accumulation (reading a score, adding to it, writing it back) across runs that may overlap — use a HubSpot calculated property instead. - Archived contacts: a contact in HubSpot’s recycle bin still reserves its email address, so an upsert against it cannot succeed. Restore it from the recycle bin, or use a different address.
- Timeouts: every request has a 30-second timeout, with automatic retries on rate limits and transient server errors (except note and task creates — see above).