Companies

Set the company of contacts

Make a company the current company of many contacts (bulk "Set company"). Send exactly one selector: `contact_ids` (up to 500), or `filters` (the `where` object `POST /v2/contacts/filter` takes in a w

POST /v2/companies/{companyId}/set-contacts

Parameters

Path parameters

companyId
string (uuid) required

Header parameters

Idempotency-Key
string required
Required. UUID per logical operation, reused on every retry. See apps/rest-api/src/shared/idempotency.ts for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict.

Request body

Content-Type: application/json

contact_ids
array<string (uuid)>
filters
object
The workspace contacts filter: the where object POST /v2/contacts/filter takes (ContactFilters), every key and value as documented there. The server parses it in full: a key it does not declare, at any depth, is 400 validation_error with details.reasonunsupported_filter_keys, and an invalid value 400 validation_error with details.reasoninvalid_filters.
excluded_ids
array<string (uuid)>
title
string

Example

{
  "contact_ids": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "filters": {}
}

Responses

200 — Successful response

Content-Type: application/json

data
object required
data.updated
array<string (uuid)> required
data.unchanged
array<string (uuid)> required
data.skipped
array<object> required
data.skipped[].id
string (uuid) required
data.skipped[].reason
string enum required
Possible values: "archived", "not_found"
data.contacts
array<object> required
data.contacts[].id
string (uuid) required
data.contacts[].company
string | null required
data.contacts[].primary_company_id
string (uuid) | null required

Example

{
  "data": {
    "updated": [
      "00000000-0000-0000-0000-000000000000"
    ],
    "unchanged": [
      "00000000-0000-0000-0000-000000000000"
    ],
    "skipped": [
      {
        "id": "00000000-0000-0000-0000-000000000000",
        "reason": "archived"
      }
    ],
    "contacts": [
      {
        "id": "00000000-0000-0000-0000-000000000000",
        "company": "string",
        "primary_company_id": "00000000-0000-0000-0000-000000000000"
      }
    ]
  }
}

400 — Request body failed validation.

Content-Type: application/json

(body)
any

401 — Missing or invalid API key.

Content-Type: application/json

(body)
any

403 — Valid key, insufficient permission.

Content-Type: application/json

(body)
any

404 — Resource does not exist.

Content-Type: application/json

(body)
any

409 — Request conflicts with the current state of the resource.

Content-Type: application/json

(body)
any

429 — Rate limit exceeded.

Content-Type: application/json

(body)
any

500 — Unexpected server error.

Content-Type: application/json

(body)
any

Code samples

curl https://api.prod.getdex.com/v2/companies/00000000-0000-0000-0000-000000000000/set-contacts \
  --request POST \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header "Idempotency-Key: $(uuidgen 2>/dev/null || python3 -c 'import uuid;print(uuid.uuid4())')" \
  --header 'Content-Type: application/json' \
  --data '{
  "contact_ids": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "filters": {}
}'
Copyright © 2026