Skip to main content
PUT
/
crm
/
companies
Assert a CRM company (upsert)
curl --request PUT \
  --url https://api.zeeg.me/v2/crm/companies \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Acme Corp",
  "domain": "acme.com",
  "description": "<string>",
  "websiteUrl": "<string>",
  "primaryLocation": "<string>",
  "socials": {
    "linkedin": "<string>",
    "twitter": "<string>",
    "facebook": "<string>",
    "instagram": "<string>"
  }
}
'
import requests

url = "https://api.zeeg.me/v2/crm/companies"

payload = {
"name": "Acme Corp",
"domain": "acme.com",
"description": "<string>",
"websiteUrl": "<string>",
"primaryLocation": "<string>",
"socials": {
"linkedin": "<string>",
"twitter": "<string>",
"facebook": "<string>",
"instagram": "<string>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Acme Corp',
domain: 'acme.com',
description: '<string>',
websiteUrl: '<string>',
primaryLocation: '<string>',
socials: {
linkedin: '<string>',
twitter: '<string>',
facebook: '<string>',
instagram: '<string>'
}
})
};

fetch('https://api.zeeg.me/v2/crm/companies', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.zeeg.me/v2/crm/companies",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Acme Corp',
'domain' => 'acme.com',
'description' => '<string>',
'websiteUrl' => '<string>',
'primaryLocation' => '<string>',
'socials' => [
'linkedin' => '<string>',
'twitter' => '<string>',
'facebook' => '<string>',
'instagram' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.zeeg.me/v2/crm/companies"

payload := strings.NewReader("{\n \"name\": \"Acme Corp\",\n \"domain\": \"acme.com\",\n \"description\": \"<string>\",\n \"websiteUrl\": \"<string>\",\n \"primaryLocation\": \"<string>\",\n \"socials\": {\n \"linkedin\": \"<string>\",\n \"twitter\": \"<string>\",\n \"facebook\": \"<string>\",\n \"instagram\": \"<string>\"\n }\n}")

req, _ := http.NewRequest("PUT", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.put("https://api.zeeg.me/v2/crm/companies")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Acme Corp\",\n \"domain\": \"acme.com\",\n \"description\": \"<string>\",\n \"websiteUrl\": \"<string>\",\n \"primaryLocation\": \"<string>\",\n \"socials\": {\n \"linkedin\": \"<string>\",\n \"twitter\": \"<string>\",\n \"facebook\": \"<string>\",\n \"instagram\": \"<string>\"\n }\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.zeeg.me/v2/crm/companies")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Acme Corp\",\n \"domain\": \"acme.com\",\n \"description\": \"<string>\",\n \"websiteUrl\": \"<string>\",\n \"primaryLocation\": \"<string>\",\n \"socials\": {\n \"linkedin\": \"<string>\",\n \"twitter\": \"<string>\",\n \"facebook\": \"<string>\",\n \"instagram\": \"<string>\"\n }\n}"

response = http.request(request)
puts response.read_body
{
  "success": true,
  "status": 200,
  "company": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "Acme Corp",
    "domain": "acme.com",
    "description": "A global provider of anvils and gadgets.",
    "websiteUrl": "https://acme.com",
    "primaryLocation": "Phoenix, AZ",
    "industries": [
      "technology"
    ],
    "socials": {
      "linkedin": "https://linkedin.com/company/acme",
      "twitter": null,
      "facebook": null,
      "instagram": null
    },
    "customAttributes": {},
    "createdAt": "2025-01-15T09:00:00+00:00",
    "updatedAt": "2025-06-01T12:00:00+00:00"
  }
}
{
"success": true,
"status": 201,
"company": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Acme Corp",
"domain": "acme.com",
"description": "A global provider of anvils and gadgets.",
"websiteUrl": "https://acme.com",
"primaryLocation": "Phoenix, AZ",
"industries": [
"technology"
],
"socials": {
"linkedin": "https://linkedin.com/company/acme",
"twitter": null,
"facebook": null,
"instagram": null
},
"customAttributes": {},
"createdAt": "2025-01-15T09:00:00+00:00",
"updatedAt": "2025-06-01T12:00:00+00:00"
}
}
{
"message": "Unauthenticated."
}
{
"success": true,
"message": "<string>",
"status": 123
}
{
"message": "The given data was invalid.",
"errors": {
"field_name": [
"The field_name field is required."
]
}
}
Creates or updates a CRM company record using a unique attribute to find an existing match.
  • If a company with the same domain is found → it is updated and 200 is returned.
  • If no match is found → a new company is created and 201 is returned.

Matching attribute

The matchingAttribute query parameter specifies which field to use for the lookup. Currently only domain is supported, as it is the only unique attribute on companies.
PUT /v2/crm/companies?matchingAttribute=domain

Use case

Assert is the recommended endpoint for bulk imports and sync jobs. Send your full company payload and let the API decide whether to create or update — no need to pre-check for duplicates.
{
  "name": "Acme Corp",
  "domain": "acme.com",
  "websiteUrl": "https://acme.com",
  "primaryLocation": "Berlin, Germany",
  "socials": {
    "linkedin": "https://linkedin.com/company/acme"
  }
}

Authorizations

Authorization
string
header
required

Query Parameters

matchingAttribute
enum<string>
required

Attribute to use when searching for an existing company. Only domain is supported.

Available options:
domain

Body

application/json
name
string
required
Example:

"Acme Corp"

domain
string | null
Example:

"acme.com"

description
string | null
websiteUrl
string | null
primaryLocation
string | null
socials
object

Response

Updated — a company with the matching domain was found and updated

success
boolean
Example:

true

status
integer
Example:

200

company
object

A CRM company record.

Last modified on June 11, 2026