v1
latestOpenAPI 3.1.02026-07-263788129.7 KBUpsert a Contact
Creates a new contact or updates an existing one.
Identifiers — either email or linkedin_url must be provided. If only linkedin_url is supplied, you must also provide account_id or domain so the contact can be associated with an account.
Duplicate resolution — the request is matched against existing contacts in the org in this order: (1) exact match on email (case-insensitive), then (2) exact match on linkedin_url. If a match is found, that contact is updated in place with the provided fields and returned; otherwise a new contact is created. Unlike POST /contacts, no 409 is raised on a duplicate identifier — the existing record is updated instead.
Account resolution priority — when creating a new contact, Monaco resolves the contact's account in this order:
- account_id (if provided)
- domain (if provided)
- the domain parsed from email
Enrichment — when this call creates a new contact (no existing match), Monaco synchronously enriches the contact and, if needed, resolves or creates the associated account. This can make those requests take several seconds to complete; clients should use generous timeouts (10s+) and avoid issuing upserts on hot paths.
Any tags list provided is appended to the existing tags on the contact.
Request body
Example request
{
"email": "jane@acme.com",
"linkedin_url": "https://linkedin.com/in/janesmith",
"first_name": "Jane",
"last_name": "Smith",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"location": "San Francisco, CA",
"domain": "acme.com"
}Response
Successful Response
Example response
{
"data": {
"id": "con_abc123",
"account_id": "acc_def456",
"first_name": "Jane",
"last_name": "Smith",
"email": "jane@acme.com",
"title": "VP of Engineering",
"phone_number": "+1-555-123-4567",
"linkedin_url": "https://linkedin.com/in/janesmith",
"location": "San Francisco, CA",
"source": "linkedin",
"notes": "Met at SaaStr 2025",
"scoring": {
"heat_score": "Hot"
},
"tags": [
"Interested",
"Decision Maker"
],
"created_at": "2025-06-15T10:30:00Z",
"updated_at": "2025-06-15T10:30:00Z"
}
}