CRM

Import or update contacts in bulk

Create-or-update up to 500 contacts in one call — the endpoint for importing a customer list. Each contact is matched against the site’s existing contacts on match_on (email by default, case-insensitively): a match is updated, everything else is created, so re-sending the same batch is safe. Any attribute the CRM has no column for goes in custom_fields as flat key/value pairs, and is auto-declared as a filterable field unless create_missing_fields is false. Tags merge with the contact’s existing tags by default; tags_mode: "replace" overwrites them. Custom fields always merge key-by-key. Use contact_fields_mode: "fill_missing" to enrich contacts while preserving existing native contact values; retry a 409 when a concurrent edit wins. Send dry_run: true first to see the created/updated counts without writing. Two deliberate limits: status (pipeline stage) applies to NEW contacts only — an import never moves an existing contact’s stage — and no contact is ever deleted. Requires scope crm:write.

post/api/v1/sites/{id}/contacts

Request

  • Base URL: https://app.mondovo.com
  • URL: https://app.mondovo.com/api/v1/sites/{id}/contacts
  • Auth: HTTP bearer

Request body

match_on'email' | 'phone'

Which field identifies an existing contact. Matching is scoped to this site, and email matching is case-insensitive.

tags_mode'merge' | 'replace'

Merge unions incoming tags with the ones already on the contact. Replace overwrites them — which discards any tag applied in the app since the last import.

contact_fields_mode'overwrite' | 'fill_missing'

fill_missing preserves populated native contact fields and fills blank phone/name fields atomically. Tags and custom fields still merge. Concurrent edits can return a retryable 409.

create_missing_fieldsboolean

Auto-declare a text field for each unrecognised custom_fields key so it is immediately filterable. Values are stored either way.

dry_runboolean

Validate and report what would change without writing.

Response

The batch was applied (or evaluated, for a dry run).

site_idstring uuid
createdinteger
updatedinteger
total_submittedinteger
duplicates_in_batchinteger

Rows collapsed because they shared a match key.

stage_changes_ignoredinteger

status values skipped because the contact already existed.

fields_definedstring[]

Custom fields auto-declared by this call.

matched_on'email' | 'phone'
messagestring

Changes

No recorded changes to this operation across all 1 revision of this API.