HubSpot
CRM and sales pipeline. Manage contacts, companies, deals, and tickets, log notes and calls, link records, and manage lists.
| Property | Value |
|---|---|
| Slug | hubspot |
| Definition version | 0.1.0 |
| Base URL | https://api.hubapi.com |
| Auth schemes | oauth2 |
| Action tools | 34 |
| By class | 13 read, 16 write, 5 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |
Measured routing accuracy
50 golden cases replayed through the router over the whole index: measured over corpus ea4f12ad2948 (65 toolkits, 2283 tools indexed and 13 declared uncallable), 34 cases written by hand and 16 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.
| Measure | Cases | Share |
|---|---|---|
| top-1 | 19/50 | 38.0% |
| top-8 | 44/50 | 88.0% |
The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. just eval-live measures the same cases through the live reranker.
Authentication
Connect an entity with ConnectionsService.InitiateConnection, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.
oauth2
| Property | Value |
|---|---|
| Authorization URL | https://app.hubspot.com/oauth/authorize |
| Token URL | https://api.hubapi.com/oauth/v1/token |
| Default scopes | crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.companies.read, crm.objects.companies.write, crm.objects.deals.read, crm.objects.deals.write, tickets, crm.objects.owners.read |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |
Tools
34 action tools. The catalog-wide slug is hubspot.<tool>, which is what search_tools returns and call_tool takes.
hubspot.create_contact
Create a new HubSpot contact record for a person: a lead, prospect, or customer in the CRM. Use when the user wants to add someone to HubSpot, not to send them an email or bill them. Requires an email address; name, phone, job title, and lifecycle stage are optional.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/contacts.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
company | string | no | Free-text company name shown on the contact record. |
email | string | yes | Contact's email address, e.g. "jane@example.com". |
firstname | string | no | Contact's first name. |
jobtitle | string | no | Contact's job title. |
lastname | string | no | Contact's last name. |
lifecyclestage | string | no | Lifecycle stage, e.g. "lead", "marketingqualifiedlead", "opportunity", "customer". |
phone | string | no | Contact's phone number. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.company | string | |
properties.email | string | |
properties.firstname | string | |
properties.jobtitle | string | |
properties.lastname | string | |
properties.lifecyclestage | string | |
properties.phone | string | |
updatedAt | string (date-time) |
Also retrieved by: "add a new lead to hubspot", "add someone to the crm", "put this person in hubspot", "register a new prospect", "build a crm profile for someone".
hubspot.get_contact
Get one HubSpot contact's full record by id: email, name, phone, company, job title, and lifecycle stage. Use when the user names a specific person already in the CRM. For finding a contact by name or email use search_contacts instead.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/objects/contacts/{{params.contact_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
contact_id | string | yes | HubSpot contact id. |
properties | string | no | Comma-separated property names to return, e.g. "email,firstname,lastname". Omit for the default property set. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
archived | boolean | |
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.company | string | |
properties.email | string | |
properties.firstname | string | |
properties.jobtitle | string | |
properties.lastname | string | |
properties.lifecyclestage | string | |
properties.phone | string | |
updatedAt | string (date-time) |
Also retrieved by: "pull up someone's hubspot profile", "look up this person in the crm", "show me what we have on this lead", "check somebody's file in hubspot".
hubspot.update_contact
Update fields on an existing HubSpot contact: name, phone, job title, lifecycle stage, or company. Use when the user wants to edit or correct a contact's record, not create a new one.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls PATCH /crm/v3/objects/contacts/{{params.contact_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
company | string | no | Free-text company name shown on the contact record. |
contact_id | string | yes | HubSpot contact id. |
email | string | no | Contact's email address. |
firstname | string | no | Contact's first name. |
jobtitle | string | no | Contact's job title. |
lastname | string | no | Contact's last name. |
lifecyclestage | string | no | Lifecycle stage, e.g. "opportunity", "customer". |
phone | string | no | Contact's phone number. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.company | string | |
properties.email | string | |
properties.firstname | string | |
properties.jobtitle | string | |
properties.lastname | string | |
properties.lifecyclestage | string | |
properties.phone | string | |
updatedAt | string (date-time) |
Also retrieved by: "fix this person's phone number in hubspot", "change someone's job title on file", "edit a lead's details", "correct info on a crm profile".
hubspot.delete_contact
Permanently delete a HubSpot contact record. Use when the user wants to remove, purge, or erase someone from the CRM entirely. This removes the contact and its activity history; it does not unsubscribe them from email or touch a Stripe billing customer.
Class destructive (held by the mutation gate until the call's own arguments carry "confirm": true). No scopes beyond the connection's defaults. Calls DELETE /crm/v3/objects/contacts/{{params.contact_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
contact_id | string | yes | HubSpot contact id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
deleted | boolean |
Also retrieved by: "wipe this person from the crm for good", "purge someone's hubspot record entirely", "get rid of this lead permanently", "erase someone from the database entirely".
hubspot.search_contacts
Search HubSpot contacts by name, email, or free text across the CRM. Use when the user describes a person rather than naming a known contact id, for example finding everyone at a company or matching an email address.
Class read (reads only). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/contacts/search.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
query | string | yes | Free-text search over name, email, phone, and company. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.company | string | |
results[].properties.email | string | |
results[].properties.firstname | string | |
results[].properties.lastname | string | |
results[].properties.phone | string | |
total | integer |
Also retrieved by: "find everyone at a certain company", "look up a lead by their email", "who do we have on file matching this name", "hunt down a person's crm profile".
hubspot.list_contacts
List HubSpot contacts in the CRM, most recently created first, paginated. Use for browsing or exporting the contact database rather than looking for one specific person.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/objects/contacts.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.email | string | |
results[].properties.firstname | string | |
results[].properties.lastname | string |
Also retrieved by: "show me every lead in the system", "pull up the whole crm database", "browse who's in the crm", "export all our leads".
hubspot.merge_contacts
Merge two HubSpot contact records into one, keeping the primary contact and folding the duplicate's properties and activity history into it. Use when the user has found a duplicate contact. Irreversible: the merged-away contact id stops existing.
Class destructive (held by the mutation gate until the call's own arguments carry "confirm": true). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/contacts/merge.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
duplicate_contact_id | string | yes | Id of the contact that gets folded in and stops existing. |
primary_contact_id | string | yes | Id of the contact that survives the merge. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.email | string | |
properties.firstname | string | |
properties.lastname | string |
Also retrieved by: "combine two duplicate leads into one", "fold this duplicate profile into the main one", "treat these two as the same person", "collapse two crm entries together".
hubspot.create_company
Create a new HubSpot company record: an organization or account in the CRM, distinct from an individual contact. Use when the user wants to add a business, not a person, to HubSpot. Requires a name; domain, industry, and location are optional.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/companies.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
city | string | no | City the company is based in. |
domain | string | no | Company's primary website domain, e.g. "acme.com". |
industry | string | no | Industry, e.g. "Computer Software". |
name | string | yes | Company name. |
phone | string | no | Company's main phone number. |
state | string | no | State or region the company is based in. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.city | string | |
properties.domain | string | |
properties.industry | string | |
properties.name | string | |
properties.phone | string | |
properties.state | string |
Also retrieved by: "add a new business to the crm", "register an organization in hubspot", "put this account into the system", "log a new client's business".
hubspot.get_company
Get one HubSpot company's full record by id: name, domain, industry, phone, and location. Use when the user names a specific organization already in the CRM.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/objects/companies/{{params.company_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
company_id | string | yes | HubSpot company id. |
properties | string | no | Comma-separated property names to return, e.g. "name,domain". Omit for the default property set. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
archived | boolean | |
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.city | string | |
properties.domain | string | |
properties.industry | string | |
properties.name | string | |
properties.phone | string | |
properties.state | string | |
updatedAt | string (date-time) |
Also retrieved by: "pull up this organization's crm profile", "show me what we know about this business", "look up an account's details".
hubspot.update_company
Update fields on an existing HubSpot company: name, domain, industry, phone, or location. Use when the user wants to edit an organization's record.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls PATCH /crm/v3/objects/companies/{{params.company_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
city | string | no | City the company is based in. |
company_id | string | yes | HubSpot company id. |
domain | string | no | Company's primary website domain. |
industry | string | no | Industry, e.g. "Computer Software". |
name | string | no | Company name. |
phone | string | no | Company's main phone number. |
state | string | no | State or region the company is based in. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.domain | string | |
properties.industry | string | |
properties.name | string | |
updatedAt | string (date-time) |
Also retrieved by: "fix the industry on this organization", "change an account's phone number", "edit a business's location on file".
hubspot.delete_company
Permanently delete a HubSpot company record and its history. Use when the user wants to remove a business from the CRM entirely.
Class destructive (held by the mutation gate until the call's own arguments carry "confirm": true). No scopes beyond the connection's defaults. Calls DELETE /crm/v3/objects/companies/{{params.company_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
company_id | string | yes | HubSpot company id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
deleted | boolean |
Also retrieved by: "remove this business from the crm for good", "purge an account entirely", "get rid of an organization's record".
hubspot.search_companies
Search HubSpot companies by name, domain, or free text. Use when the user describes an organization rather than naming a known company id.
Class read (reads only). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/companies/search.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
query | string | yes | Free-text search over name, domain, and industry. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.domain | string | |
results[].properties.industry | string | |
results[].properties.name | string | |
total | integer |
Also retrieved by: "find a business by its website", "look up an account by name", "hunt down which organization this is".
hubspot.create_deal
Create a new HubSpot deal: an opportunity moving through a sales pipeline toward a close date. Use when the user wants to open, start, or log a sale or piece of revenue, not a support ticket or an invoice. Requires a deal name and stage; pipeline, amount, and close date are optional.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/deals.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
amount | string | no | Deal value as a decimal string, e.g. "15000.00". |
closedate | string | no | Expected or actual close date, RFC 3339. |
dealname | string | yes | Deal's name, e.g. "Acme Corp - annual plan". |
dealstage | string | yes | Pipeline stage id the deal starts in. Use list_deal_pipelines to see valid stage ids. |
pipeline | string | no | Pipeline id the deal belongs to. Omit for the default pipeline. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.amount | string | |
properties.closedate | string | |
properties.dealname | string | |
properties.dealstage | string | |
properties.pipeline | string |
Also retrieved by: "open a new sales opportunity", "start tracking a potential sale", "log a piece of revenue in the pipeline", "kick off a new opportunity for this account".
hubspot.get_deal
Get one HubSpot deal's full record by id: name, amount, stage, pipeline, and close date. Use when the user names a specific deal or opportunity.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/objects/deals/{{params.deal_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
deal_id | string | yes | HubSpot deal id. |
properties | string | no | Comma-separated property names to return, e.g. "dealname,amount,dealstage". Omit for the default property set. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
archived | boolean | |
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.amount | string | |
properties.closedate | string | |
properties.dealname | string | |
properties.dealstage | string | |
properties.pipeline | string | |
updatedAt | string (date-time) |
Also retrieved by: "check the status of this opportunity", "pull up details on a sale in progress", "show me where this opportunity stands".
hubspot.update_deal
Update fields on an existing HubSpot deal: name, amount, stage, pipeline, or close date. Use when the user wants to advance, reprice, or reschedule a deal, for example moving it to the next pipeline stage.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls PATCH /crm/v3/objects/deals/{{params.deal_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
amount | string | no | Deal value as a decimal string. |
closedate | string | no | Expected or actual close date, RFC 3339. |
deal_id | string | yes | HubSpot deal id. |
dealname | string | no | Deal's name. |
dealstage | string | no | Pipeline stage id to move the deal to. |
pipeline | string | no | Pipeline id the deal belongs to. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.amount | string | |
properties.dealname | string | |
properties.dealstage | string | |
updatedAt | string (date-time) |
Also retrieved by: "move this opportunity to the next stage", "reprice a sale in the pipeline", "push back the close date on this opportunity", "advance this to negotiation".
hubspot.delete_deal
Permanently delete a HubSpot deal record. Use when the user wants to remove an opportunity from the pipeline entirely, rather than mark it lost or closed.
Class destructive (held by the mutation gate until the call's own arguments carry "confirm": true). No scopes beyond the connection's defaults. Calls DELETE /crm/v3/objects/deals/{{params.deal_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
deal_id | string | yes | HubSpot deal id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
deleted | boolean |
Also retrieved by: "scrap this opportunity for good", "remove a sale from the pipeline entirely", "wipe this opportunity from the system".
hubspot.search_deals
Search HubSpot deals by name or free text across the sales pipeline. Use when the user describes a deal rather than naming a known deal id.
Class read (reads only). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/deals/search.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
query | string | yes | Free-text search over deal name. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.amount | string | |
results[].properties.dealname | string | |
results[].properties.dealstage | string | |
total | integer |
Also retrieved by: "find an opportunity by name", "look up a sale in the pipeline", "hunt down a specific opportunity".
hubspot.list_deal_pipelines
List the sales pipelines configured in HubSpot and the stages within each one. Use when the user asks what stages a deal can move through, or which pipeline a team uses, before creating or moving a deal.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/pipelines/deals.
Takes no arguments.
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
results | array of object | |
results[].displayOrder | integer | |
results[].id | string | |
results[].label | string | |
results[].stages | array of object | |
results[].stages[].displayOrder | integer | |
results[].stages[].id | string | |
results[].stages[].label | string |
Also retrieved by: "what stages does our sales process have", "show the sales stages set up in hubspot", "what steps does an opportunity move through", "how many phases does a sale pass through".
hubspot.create_ticket
Create a new HubSpot support ticket: a customer service case in the CRM's ticket pipeline. Use when the user wants to open, file, or log a customer support issue, not an engineering bug in Jira or Linear. Requires a subject; content and priority are optional.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/tickets.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
content | string | no | Ticket body describing the issue. |
pipeline_stage | string | no | Ticket pipeline stage id to start in. Omit for the default pipeline's first stage. |
priority | string | no | Priority, e.g. "LOW", "MEDIUM", "HIGH". |
subject | string | yes | One-line ticket subject. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.content | string | |
properties.hs_pipeline_stage | string | |
properties.hs_ticket_priority | string | |
properties.subject | string |
Also retrieved by: "open a customer support case", "file a service issue for a client", "log a complaint from a customer", "start a help desk case".
hubspot.get_ticket
Get one HubSpot support ticket's full record by id: subject, content, pipeline stage, and priority. Use when the user names a specific support ticket.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/objects/tickets/{{params.ticket_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
properties | string | no | Comma-separated property names to return, e.g. "subject,content,hs_ticket_priority". Omit for the default property set. |
ticket_id | string | yes | HubSpot ticket id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
archived | boolean | |
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.content | string | |
properties.hs_pipeline_stage | string | |
properties.hs_ticket_priority | string | |
properties.subject | string | |
updatedAt | string (date-time) |
Also retrieved by: "pull up a customer's support case", "check the status of a service issue", "show me what this complaint says".
hubspot.update_ticket
Update fields on an existing HubSpot support ticket: subject, content, pipeline stage, or priority. Use when the user wants to move a ticket forward or edit its details.
Class write (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls PATCH /crm/v3/objects/tickets/{{params.ticket_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
content | string | no | Ticket body describing the issue. |
pipeline_stage | string | no | Ticket pipeline stage id to move the ticket to. |
priority | string | no | Priority, e.g. "LOW", "MEDIUM", "HIGH". |
subject | string | no | One-line ticket subject. |
ticket_id | string | yes | HubSpot ticket id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.hs_pipeline_stage | string | |
properties.hs_ticket_priority | string | |
properties.subject | string | |
updatedAt | string (date-time) |
Also retrieved by: "move a support case to the next stage", "change the priority on a service issue", "edit the details on a complaint".
hubspot.delete_ticket
Permanently delete a HubSpot support ticket record. Use when the user wants to remove a customer service case from the CRM entirely.
Class destructive (held by the mutation gate until the call's own arguments carry "confirm": true). No scopes beyond the connection's defaults. Calls DELETE /crm/v3/objects/tickets/{{params.ticket_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
ticket_id | string | yes | HubSpot ticket id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
deleted | boolean |
Also retrieved by: "remove a support case from the system for good", "purge a service issue entirely", "wipe a customer complaint record".
hubspot.search_tickets
Search HubSpot support tickets by subject or free text. Use when the user describes a customer issue rather than naming a known ticket id.
Class read (reads only). No scopes beyond the connection's defaults. Calls POST /crm/v3/objects/tickets/search.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
query | string | yes | Free-text search over subject and content. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.hs_pipeline_stage | string | |
results[].properties.hs_ticket_priority | string | |
results[].properties.subject | string | |
total | integer |
Also retrieved by: "find a support case by subject", "look up a service issue", "hunt down a customer complaint".
hubspot.create_note
Log a note on HubSpot's activity timeline: free-text commentary about a contact, company, deal, or ticket. Use when the user wants to jot down context in the CRM, not send a message. Link the note to a record afterward with create_association.
Class write (writes, no confirmation needed). Scopes crm.objects.notes.write. Calls POST /crm/v3/objects/notes.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
content | string | yes | The note's text. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.hs_note_body | string |
Also retrieved by: "jot down some context on this account", "leave a comment on a crm record", "write down what happened on a call", "save some background on this lead".
hubspot.create_task
Create a HubSpot task: a to-do reminder for a sales or support rep, with a subject, due date, and priority. Use when the user wants a follow-up reminder in the CRM, distinct from a Jira ticket or a Linear issue.
Class write (writes, no confirmation needed). Scopes crm.objects.tasks.write. Calls POST /crm/v3/objects/tasks.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
body | string | no | Longer task detail or instructions. |
due_date | string | no | When the task is due, RFC 3339. |
owner_id | string | no | HubSpot owner id the task is assigned to. See list_owners. |
priority | string | no | Priority, e.g. "LOW", "MEDIUM", "HIGH". |
subject | string | yes | One-line task title. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.hs_task_body | string | |
properties.hs_task_priority | string | |
properties.hs_task_status | string | |
properties.hs_task_subject | string |
Also retrieved by: "set a follow-up reminder for a rep", "schedule a to-do on this account", "remind someone to check back in", "put a reminder on my plate for this lead".
hubspot.update_task
Update a HubSpot task's subject, body, due date, priority, or status. Use when the user wants to reschedule a follow-up or mark it done.
Class write (writes, no confirmation needed). Scopes crm.objects.tasks.write. Calls PATCH /crm/v3/objects/tasks/{{params.task_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
body | string | no | Longer task detail or instructions. |
due_date | string | no | When the task is due, RFC 3339. |
priority | string | no | Priority, e.g. "LOW", "MEDIUM", "HIGH". |
status | string | no | Task status, e.g. "NOT_STARTED", "IN_PROGRESS", "COMPLETED". |
subject | string | no | One-line task title. |
task_id | string | yes | HubSpot task id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
id | string | |
properties | object | |
properties.hs_task_status | string | |
properties.hs_task_subject | string | |
updatedAt | string (date-time) |
Also retrieved by: "mark a follow-up as done", "push back a reminder's due date", "reschedule a rep's to-do".
hubspot.list_tasks
List HubSpot tasks, most recently created first, paginated. Use for browsing a rep's outstanding to-dos rather than looking for one specific task.
Class read (reads only). Scopes crm.objects.tasks.read. Calls GET /crm/v3/objects/tasks.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
limit | integer | no | Page size, default 10. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].id | string | |
results[].properties | object | |
results[].properties.hs_task_status | string | |
results[].properties.hs_task_subject | string |
Also retrieved by: "show me what's on my plate today", "what follow-ups are still open", "browse outstanding reminders", "check a rep's open to-dos".
hubspot.log_call
Log a phone call on HubSpot's activity timeline: the call's notes, direction, and duration. Use when the user wants to record that a call happened, not to place or receive one. Link the call to a contact afterward with create_association.
Class write (writes, no confirmation needed). Scopes crm.objects.calls.write. Calls POST /crm/v3/objects/calls.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
direction | string | no | Call direction, "INBOUND" or "OUTBOUND". |
duration_ms | integer | no | Call duration in milliseconds. |
notes | string | yes | Summary of what the call covered. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
createdAt | string (date-time) | |
id | string | |
properties | object | |
properties.hs_call_body | string | |
properties.hs_call_direction | string | |
properties.hs_call_duration | string |
Also retrieved by: "record that a phone conversation happened", "note down what we discussed on the phone", "save a conversation summary to the timeline".
hubspot.create_association
Link two HubSpot records together, such as a contact to a company or a deal to a contact, using HubSpot's default association between the two object types. Use when the user wants to connect records that already exist in the CRM.
Class write (writes, no confirmation needed). Scopes crm.objects.contacts.write. Calls PUT /crm/v4/objects/{{params.from_object_type}}/{{params.from_object_id}}/associations/default/{{params.to_object_type}}/{{params.to_object_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
from_object_id | string | yes | Id of the source record. |
from_object_type | string | yes | Object type of the source record, e.g. "contacts", "companies", "deals", "tickets", "notes", "tasks", "calls". |
to_object_id | string | yes | Id of the target record. |
to_object_type | string | yes | Object type of the target record. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
fromObjectTypeId | string | |
labels | array of string | |
toObjectTypeId | string |
Also retrieved by: "connect this person to their employer", "link a sale to the person who owns it", "tie this record to another one", "attach a contact to a company".
hubspot.remove_association
Remove the link between two HubSpot records without deleting either one. Use when the user wants to disconnect a contact, company, deal, or ticket from another record.
Class write (writes, no confirmation needed). Scopes crm.objects.contacts.write. Calls DELETE /crm/v4/objects/{{params.from_object_type}}/{{params.from_object_id}}/associations/{{params.to_object_type}}/{{params.to_object_id}}.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
from_object_id | string | yes | Id of the source record. |
from_object_type | string | yes | Object type of the source record, e.g. "contacts", "deals". |
to_object_id | string | yes | Id of the target record. |
to_object_type | string | yes | Object type of the target record. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
removed | boolean |
Also retrieved by: "unlink two records without deleting them", "disconnect a person from an account", "take away a link between two entries".
hubspot.list_association_types
List the association types HubSpot allows between two kinds of records, for example the ways a contact can be linked to a deal. Use when create_association needs a label other than the default.
Class read (reads only). Scopes crm.objects.contacts.read. Calls GET /crm/v4/associations/{{params.from_object_type}}/{{params.to_object_type}}/labels.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
from_object_type | string | yes | Object type of the source record, e.g. "contacts". |
to_object_type | string | yes | Object type of the target record, e.g. "deals". |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
results | array of object | |
results[].category | string | |
results[].label | string | |
results[].typeId | integer |
Also retrieved by: "what ways can these two records be linked", "show the relationship options between a contact and a deal", "find out how a company and a deal can connect".
hubspot.add_contact_to_list
Add one or more HubSpot contacts to a marketing or active list by list id. Use when the user wants to build an audience or segment for a campaign, not add a contact to the CRM itself.
Class write (writes, no confirmation needed). Scopes crm.lists.write. Calls PUT /crm/v3/lists/{{params.list_id}}/memberships/add.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
contact_ids | array of string | yes | Contact ids to add to the list. |
list_id | string | yes | HubSpot list id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
recordIdsProcessed | array of string |
Also retrieved by: "build an audience for a campaign", "put someone into a marketing segment", "enroll a lead in a campaign audience", "grow a segment with a new lead".
hubspot.remove_contact_from_list
Remove one or more HubSpot contacts from a list by list id, without deleting the contacts themselves. Use when the user wants to shrink a segment or unenroll someone from a campaign audience.
Class write (writes, no confirmation needed). Scopes crm.lists.write. Calls PUT /crm/v3/lists/{{params.list_id}}/memberships/remove.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
contact_ids | array of string | yes | Contact ids to remove from the list. |
list_id | string | yes | HubSpot list id. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
recordIdsProcessed | array of string |
Also retrieved by: "take someone off a campaign segment", "drop a lead from a marketing audience", "shrink a segment by pulling someone out", "unenroll someone from a campaign".
hubspot.list_owners
List the HubSpot users who can own contacts, companies, deals, and tickets, for example to find a sales rep's owner id before assigning a record. Use when the user asks who a record's owner could be, not who is a member of a Slack channel or Linear team.
Class read (reads only). No scopes beyond the connection's defaults. Calls GET /crm/v3/owners.
Arguments:
| Argument | Type | Required | Notes |
|---|---|---|---|
after | string | no | Pagination cursor from a previous response's paging.next.after. |
email | string | no | Filter to the owner with this email address. |
limit | integer | no | Page size, default 100. |
Result fields (the payload is trimmed to these before it reaches the model):
| Field | Type | Notes |
|---|---|---|
paging | object | |
paging.next | object | |
paging.next.after | string | |
results | array of object | |
results[].email | string | |
results[].firstName | string | |
results[].id | string | |
results[].lastName | string |
Also retrieved by: "who can be assigned as the rep on a record", "show me the sales reps in the system", "find someone's rep id before assigning a deal".