GoHighLevel Contacts API

Upsert Contact

POST/contacts/upsert

POST /contacts/upsert If the setting is configured to check both Email and Phone, the API will attempt to identify an existing contact based on the priority sequence specified in the setting, and will create or update the contact accordingly. If two separate contacts already exist—one with the same email and another with the same phone—and an upsert request includes both the email and phone, the API will update the contact that matches the first field in the configured sequence, and ignore the second field to prevent duplication It takes 51 body fields, requires the contacts.write scope and authenticates with a sub-account (location) token.

Request and authentication

Method
POST
Full URL
https://services.leadconnectorhq.com/contacts/upsert
Scopes
contacts.write
Token type
Sub-account (location) token
Accepted auth
OAuth Access Token, Private Integration Token
API version header
Version: 2021-07-28
Schema verified
22 June 2026

Notes from the field

  • For multi-contact imports, use the `hylo_bulk_upsert_contacts` MCP tool — one call instead of N round-trips.
  • Pass `tags` inline here to skip a follow-up add-tags call (saves 1 round-trip per contact).
  • Pass `customFields` inline here to skip per-field update-contact-field calls.

This endpoint is safe to fan out in parallel, so a batch of records costs roughly one round trip instead of one per record. Hylo's bulk tools do that server-side and retry HighLevel's 429s with back-off.

Request body

JSON body fields. Nested objects are shown indented under their parent.

NameTypeDescription
firstNamestring

Example: Rosan

lastNamestring

Example: Deo

namestring

Example: Rosan Deo

emailstring

Example: rosan@deos.com

locationIdrequiredstring

Example: ve9EPM428h8vShlRW1KT

genderstring

Example: male

phonestring

Example: +1 888-888-8888

address1string

Example: 3535 1st St N

citystring

Example: Dolomite

statestring

Example: AL

postalCodestring

Example: 35061

websitestring

Example: https://www.tesla.com

timezonestring

Example: America/Chihuahua

dndboolean

Example: true

dndSettingsobject
Callobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
Emailobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
SMSobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
WhatsAppobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
GMBobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
FBobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
inboundDndSettingsobject
allobject
statusrequiredstring

One of: active, inactive

messagestring
tagsarray

This field will overwrite all current tags associated with the contact. To update a tags, it is recommended to use the Add Tag or Remove Tag API instead.

Example: nisi sint commodo amet,consequat

customFieldsarray
sourcestring

Example: public api

dateOfBirthobject

The birth date of the contact. Supported formats: YYYY/MM/DD, MM/DD/YYYY, YYYY-MM-DD, MM-DD-YYYY, YYYY.MM.DD, MM.DD.YYYY, YYYY_MM_DD, MM_DD_YYYY

Example: 1990-09-25

countrystring

Example: US

companyNamestring

Example: DGS VolMAX

assignedTostring

User's Id

Example: y0BeYjuRIlDwsDcOHOJo

createNewIfDuplicateAllowedboolean

Controls whether to create a new contact or update an existing duplicate. Scenario 1: If this value is true and the location allows duplicate contacts, a new contact will be created immediately without checking for duplicates. Scenario 2: If this value is true but the location does not allow duplicate contacts, this field is ignored and the normal upsert behavior applies: the API will search for an existing duplicate contact, update it if found, or create a new contact if not found. Scenario 3: If this value is false or not provided, the normal upsert behavior applies regardless of the location's duplicate contact setting.

Example: false

Response fields

Top-level fields returned on a successful call.

NameTypeDescription
newboolean

Example: true

contactobject
idstring

Example: seD4PfOuKoVMLkEZqohJ

namestring

Example: rubika deo

locationIdstring

Example: ve9EPM428h8vShlRW1KT

firstNamestring

Example: rubika

lastNamestring

Example: Deo

emailstring

Example: rubika@deos.com

emailLowerCasestring

Example: rubika@deos.com

timezonestring

Example: Asia/Calcutta

companyNamestring

Example: DGS VolMAX

phonestring

Example: +18832327657

dndboolean

Example: true

dndSettingsobject
Callobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
Emailobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
SMSobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
WhatsAppobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
GMBobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
FBobject
statusrequiredstring

One of: active, inactive, permanent

messagestring
codestring
typestring

Example: read

sourcestring

Example: public api

assignedTostring

Example: ve9EPM428h8vShlRW1KT

address1string

Example: 3535 1st St N

citystring

Example: ruDolomitebika

statestring

Example: AL

countrystring

Example: US

postalCodestring

Example: 35061

websitestring

Example: https://www.tesla.com

tagsarray

Example: nisi sint commodo amet,consequat

dateOfBirthstring

Example: Date format YYYY-MM-DD

dateAddedstring

Example: 2021-07-02T05:18:26.704Z

dateUpdatedstring

Example: 2021-07-02T05:18:26.704Z

traceIdstring

Example request

Copy-paste ready. Swap YOUR_TOKEN for your access token or Private Integration Token.

curl -X POST 'https://services.leadconnectorhq.com/contacts/upsert' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -d '{
    "locationId": "ve9EPM428h8vShlRW1KT"
  }'

Skip the schema lookup

Hylo gives your AI agent this schema — and the other 52 documented here — without you looking anything up. Ask in plain English; it picks the endpoint, fills the body, and can run the call against your own sub-account.

More contacts endpoints