API

중복 레코드 조회

작성일 2026.04.23 | 수정일 2026.04.28

POST/crm-core/v1/records/duplicates

개체 내에서 지정한 속성 값(또는 레코드 이름)을 기준으로 중복 레코드 그룹을 탐지합니다. 같은 전화번호·이메일·이름 등으로 중복 등록된 레코드를 찾아 병합 후보 목록을 반환합니다.

Body Params

NameTypeRequiredDescription
entityIdstring*검사 대상 개체 ID
propertyIdsarray<string>중복 검사 속성 ID 목록 (권장)
propertyIdstring단일 속성 ID (레거시, 하나만 검사)
includeNameboolean레코드 name 필드도 중복 검사에 포함할지 여부
recordIdsarray<string>검사 범위를 특정 레코드 ID 집합으로 제한 (예: 최근 임포트 건만 검사)

Response

NameTypeRequiredDescription
groupsarray<object>*중복 그룹 배열
keystring*중복 기준이 된 값 (이름 또는 속성 값)
recordIdsarray<string>*해당 그룹의 레코드 ID 목록
countnumber*그룹 내 레코드 수
totalDuplicatesnumber*중복으로 판별된 총 레코드 수

Structure

코드 예제

const crypto = require('crypto');

const apiKey = 'NCSXXXXXXXXXXXXX';
const apiSecret = 'YOUR_API_SECRET';
const dateTime = new Date().toISOString();
const salt = crypto.randomBytes(16).toString('hex');
const signature = crypto.createHmac('sha256', apiSecret).update(dateTime + salt).digest('hex');
const authHeader = HMAC-SHA256 apiKey=${apiKey}, date=${dateTime}, salt=${salt}, signature=${signature};

const response = await fetch('https://api.solapi.com/crm-core/v1/records/duplicates', {
method: 'POST',
headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' },
body: JSON.stringify({
"entityId": "CRMET1260423081530123XYZ11122233",
"propertyIds": [
"CRMPP1260423091530123PHON1112223"
]
})
});
const data = await response.json();

import hmac, hashlib, secrets, requests
from datetime import datetime, timezone

api_key = 'NCSXXXXXXXXXXXXX'
api_secret = 'YOUR_API_SECRET'
date_time = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
salt = secrets.token_hex(16)
signature = hmac.new(api_secret.encode(), (date_time + salt).encode(), hashlib.sha256).hexdigest()
auth_header = f'HMAC-SHA256 apiKey={api_key}, date={date_time}, salt={salt}, signature={signature}'

response = requests.post('https://api.solapi.com/crm-core/v1/records/duplicates', headers={
'Authorization': auth_header,
'Content-Type': 'application/json'
}, json={
"entityId": "CRMET1260423081530123XYZ11122233",
"propertyIds": [
"CRMPP1260423091530123PHON1112223"
]
})
data = response.json()

API_KEY="NCSXXXXXXXXXXXXX"
API_SECRET="YOUR_API_SECRET"
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
SALT=$(openssl rand -hex 16)
SIGNATURE=$(echo -n "${DATE}${SALT}" | openssl dgst -sha256 -hmac "${API_SECRET}" | awk '{print $NF}')
AUTH="HMAC-SHA256 apiKey=${API_KEY}, date=${DATE}, salt=${SALT}, signature=${SIGNATURE}"

curl -X POST 'https://api.solapi.com/crm-core/v1/records/duplicates' \
-H "Authorization: ${AUTH}" \
-H "Content-Type: application/json" \
-d '{"entityId": "CRMET1260423081530123XYZ11122233", "propertyIds": ["CRMPP1260423091530123PHON1112223"]}'

lightbulb

`includeName: true`로 레코드 이름까지 중복 기준으로 포함할 수 있습니다. 여러 속성을 함께 검사하면 **모든 속성 값이 일치**하는 레코드만 그룹핑됩니다(AND 조건).

lightbulb

**401 응답**: `{ "errorCode": "Unauthorized", "errorMessage": "권한이 없습니다." }`