<article class="sy-endpoint"><h3><code>POST /v1/connectors/hubspot/contacts</code></h3><p>Create a contact, or update the existing one that matches the email.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised HubSpot portal to write into.</td></tr><tr><td>email</td><td>string</td><td>yes</td><td>The match key. Trimmed and lowercased before comparison, so casing never creates a duplicate.</td></tr><tr><td>properties</td><td>object</td><td>yes</td><td>Internal property names to values, including any custom properties defined in your portal.</td></tr><tr><td>on_conflict</td><td>string</td><td>no</td><td>One of update or skip. Defaults to update, which is what deduplication wants.</td></tr><tr><td>associate_company</td><td>string</td><td>no</td><td>A company domain or ID to link the contact to. Created when create_company is true.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_b4862049",
"connector": "hubspot",
"status": "ok",
"data": {
"contact_id": "701842933",
"action": "updated",
"email": "lena@harbourline.example",
"properties_written": ["firstname", "lifecyclestage"],
"portal_id": "48120037"
}
}</code></pre></article><article class="sy-endpoint"><h3><code>GET /v1/connectors/hubspot/contacts</code></h3><p>Look up contacts by email or by any indexed property value.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised HubSpot portal to search.</td></tr><tr><td>email</td><td>string</td><td>no</td><td>Exact email match. Fastest lookup and the one most flows use.</td></tr><tr><td>property</td><td>string</td><td>no</td><td>An alternative property to match on when you have no email.</td></tr><tr><td>value</td><td>string</td><td>no</td><td>The value to match against the named property.</td></tr><tr><td>limit</td><td>integer</td><td>no</td><td>Results per page, 1 to 100. Defaults to 25.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_c5973150",
"connector": "hubspot",
"status": "ok",
"data": [
{
"contact_id": "701842933",
"email": "lena@harbourline.example",
"firstname": "Lena",
"lifecyclestage": "customer",
"owner_email": "marcus@syncline.topclb.com"
}
],
"next_cursor": null
}</code></pre></article><article class="sy-endpoint"><h3><code>POST /v1/connectors/hubspot/deals</code></h3><p>Open a deal in a named pipeline and stage, linked to a contact.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised HubSpot portal to write into.</td></tr><tr><td>dealname</td><td>string</td><td>yes</td><td>The deal title as it will read in the pipeline view.</td></tr><tr><td>pipeline</td><td>string</td><td>yes</td><td>Pipeline name or ID. Refused with 404 when the pipeline does not exist in this portal.</td></tr><tr><td>dealstage</td><td>string</td><td>yes</td><td>Stage name or ID inside that pipeline.</td></tr><tr><td>amount</td><td>number</td><td>no</td><td>Deal value as a decimal. Convert from minor units before sending if the source is a payments app.</td></tr><tr><td>contact_id</td><td>string</td><td>no</td><td>Contact to associate the deal with, usually the ID returned by the contacts route.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_d6a84261",
"connector": "hubspot",
"status": "ok",
"data": {
"deal_id": "20933471",
"dealname": "Harbour Line Coffee, annual",
"pipeline": "default",
"dealstage": "contractsent",
"amount": 4900.00,
"associated_contacts": ["701842933"]
}
}</code></pre></article><article class="sy-endpoint"><h3><code>PATCH /v1/connectors/hubspot/deals/{deal_id}</code></h3><p>Move a deal forward, or write properties when the signal came from elsewhere.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised HubSpot portal holding the deal.</td></tr><tr><td>dealstage</td><td>string</td><td>no</td><td>The stage to move to. Must exist in the deal's current pipeline.</td></tr><tr><td>properties</td><td>object</td><td>no</td><td>Any other deal properties to write. Only the keys you send are touched.</td></tr><tr><td>note</td><td>string</td><td>no</td><td>Text logged on the deal timeline alongside the change, so the history explains itself.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_e7b95372",
"connector": "hubspot",
"status": "ok",
"data": {
"deal_id": "20933471",
"dealstage_from": "contractsent",
"dealstage_to": "closedwon",
"note_logged": true,
"updated_at": "2026-09-07T11:06:22Z"
}
}</code></pre></article><article class="sy-endpoint"><h3><code>GET /v1/connectors/hubspot/properties</code></h3><p>List the properties available on an object type, including custom ones.</p><div class="sy-table-wrap"><table><thead><tr><th>Param</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>connection_id</td><td>string</td><td>yes</td><td>The authorised HubSpot portal to inspect.</td></tr><tr><td>object_type</td><td>string</td><td>yes</td><td>One of contacts, companies or deals.</td></tr><tr><td>custom_only</td><td>boolean</td><td>no</td><td>Return only properties your portal defined, hiding the standard set. Defaults to false.</td></tr></tbody></table></div><pre><code>{
"run_id": "run_f8ca6483",
"connector": "hubspot",
"status": "ok",
"data": [
{
"name": "lifecyclestage",
"label": "Lifecycle stage",
"type": "enumeration",
"options": ["subscriber", "lead", "opportunity", "customer"],
"custom": false
}
]
}</code></pre></article>