---
ref: tool:hubspot/upsert-contacts
name: Create or update contacts
company: company:hubspot
workflows: [workflow:executive-job-change, workflow:webinar-follow-up, workflow:meetings-to-crm, workflow:personal-email-enrichment, workflow:chat-buyers-to-sales, workflow:inbound-lead-routing, workflow:job-title-personas, workflow:meeting-booked-handoff]
access: [mcp, api]
tags: [capability:manage-crm, category:crm, has:api, has:mcp]
docs: https://developers.hubspot.com/docs/api-reference/latest/crm/objects/contacts/batch/upsert-contacts
updated: 2026-10-28
---

# Create or update contacts

Creates contacts or updates the ones that already exist with new property values.

Note: Matches each contact on `idProperty`, `email` or a custom unique property. On MCP, `manage_crm_objects` waits for the user to confirm the proposed changes before it writes.

## Set up

Use the first option your agent supports.

### MCP (official, remote)

Add this server to your agent's MCP settings, then sign in when asked.

```json
{ "mcpServers": { "hubspot": { "url": "https://mcp.hubspot.com" } } }
```

Call the MCP tool `manage_crm_objects`.

Server URL: https://mcp.hubspot.com

### API (official)

- Base URL: https://api.hubapi.com
- Endpoint: `POST /crm/objects/2026-09/contacts/batch/upsert`
- Auth: send the header `Authorization: Bearer $HUBSPOT_API_KEY`
- Docs: https://developers.hubspot.com/docs/api-reference/latest/overview

Note: Use a service key or an app's static access token with the CRM scopes the calls need; paths carry a dated version such as `2026-09`.

Before anything else, confirm access with the cheapest read-only call, like a list or a search. Never send or change anything to test access.

## Rules

- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
