API

활동 완료 처리

작성일 2026.03.24 | 수정일 2026.04.29

POST/crm-core/v1/activities/{activityId}/complete

활동(Activity)을 완료 처리합니다. outcomeCOMPLETED로 설정되고 completedAt에 현재 시각이 기록됩니다. 선택적으로 결과 메모(outcomeNote)를 함께 남길 수 있습니다. MEMBER 이상 권한이 필요합니다.

Path Params

NameTypeRequiredDescription
activityIdstring*완료 처리할 활동의 고유 ID

Body Params

NameTypeRequiredDescription
outcomeNotestring활동 결과 메모 (예: 통화 성공, 다음 미팅 일정 확정)

Response

NameTypeRequiredDescription
activityIdstring*활동 고유 ID (CRMAC1…)
accountIdstring*계정 고유 ID
entityIdstring연결된 개체 ID
recordIdstring연결된 레코드 ID
activityTypestring*활동 유형. CALL / EMAIL / MEETING / NOTE / TASK / MESSAGE / OTHER
subjectstring*활동 제목
descriptionstring*활동 상세 설명
outcomestring*활동 결과. COMPLETED로 전환됨
outcomeNotestring요청에서 전달한 결과 메모
completedAtdate*완료 처리 시각 (UTC, 서버가 자동 기록)
scheduledAtdate원래 예정 시각
dueDatedate마감 일시
assignedMemberIdstring담당 멤버 ID
assignedMemberIdsarray<string>*담당 멤버 ID 목록
durationMinutesnumber*소요 시간 (분)
dateCreateddate*활동 생성 시각 (UTC)
dateUpdateddate*최근 수정 시각 (UTC)

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/activities/CRMAC1260423081530123ABC11122233/complete', {
method: 'POST',
headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' },
body: JSON.stringify({
"outcomeNote": "통화 성공. 다음 주 미팅 일정 확정."
})
});
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/activities/CRMAC1260423081530123ABC11122233/complete', headers={
'Authorization': auth_header,
'Content-Type': 'application/json'
}, json={
"outcomeNote": "통화 성공. 다음 주 미팅 일정 확정."
})
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/activities/CRMAC1260423081530123ABC11122233/complete' \
-H "Authorization: ${AUTH}" \
-H "Content-Type: application/json" \
-d '{"outcomeNote": "통화 성공. 다음 주 미팅 일정 확정."}'

lightbulb

이미 `outcome`이 `COMPLETED`인 활동을 다시 완료 처리하면 `completedAt`이 갱신되고 `outcomeNote`가 덮어써집니다. 활동 상태를 되돌리려면 `PATCH /crm-core/v1/activities/{activityId}`로 `outcome: PENDING`을 설정하세요.

lightbulb

**HTTP 200** 응답 (이전 201 → 의미상 update 라 200).

lightbulb

빈 body 호출 시 기존 `outcomeNote`가 빈 문자열로 덮어쓰일 수 있습니다 — 보존하려면 명시적으로 전달하세요.

lightbulb

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