<!-- Generated by `just docs` from catalog/toolkits/hubspot.yaml, catalog/expansions/hubspot.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# 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".
