API

활동 생성

작성일 2026.03.24 | 수정일 2026.04.29

POST/crm-core/v1/activities

레코드와 연관된 활동(통화·이메일·미팅·노트·태스크·메시지 등)을 생성합니다. 활동은 고객 커뮤니케이션 타임라인을 구축하고 후속 조치 일정을 관리하는 데 사용합니다. MEMBER 이상 권한이 필요합니다.

Body Params

NameTypeRequiredDescription
activityTypestring*활동 유형. enum 검증 적용 — 가능 값: CALL, EMAIL, MEETING, NOTE, TASK, MESSAGE, OTHER. 다른 값 입력 시 400 Bad Request
subjectstring*활동 제목. 빈 문자열 금지 (@IsNotEmpty)
entityIdstring연결된 개체 ID
recordIdstring연결된 레코드 ID (권장)
descriptionstring활동 상세 설명
relatedRecordIdsarray<string>추가 연관 레코드 ID 목록
attachmentIdsarray<string>첨부파일 ID 목록 (최대 20개)
scheduledAtdate활동 예정 일시 (ISO 8601)
dueDatedate활동 마감 일시 (ISO 8601)
assignedMemberIdstring대표 담당 멤버 ID
assignedMemberIdsarray<string>다중 담당 멤버 ID 목록
durationMinutesnumber소요 시간 (분)
metadataobject추가 메타데이터 (자유 형식)

Response

NameTypeRequiredDescription
activityIdstring*활동 고유 ID (CRMAC1…)
accountIdstring*계정 고유 ID
entityIdstring연결된 개체 ID
recordIdstring연결된 레코드 ID
activityTypestring*활동 유형
subjectstring*활동 제목
descriptionstring*활동 상세 설명 (미지정 시 빈 문자열)
relatedRecordIdsarray<string>*연관 레코드 ID 목록
attachmentIdsarray<string>*첨부파일 ID 목록 (기본 빈 배열)
outcomestring*초기값 PENDING
outcomeNotestring결과 메모
scheduledAtdate예정 일시
completedAtdate완료 시각 (완료 처리 시)
dueDatedate마감 일시
assignedMemberIdstring대표 담당 멤버
assignedMemberIdsarray<string>*다중 담당 멤버
durationMinutesnumber*소요 시간 (기본 0)
metadataobject*메타데이터 (기본 {})
visibilitystring*공개 범위. PRIVATE / PUBLIC
ownerIdstring소유자 멤버 ID
createdBystring생성한 멤버 ID
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', {
method: 'POST',
headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' },
body: JSON.stringify({
"activityType": "CALL",
"subject": "신규 고객 첫 통화",
"recordId": "CRMRC1260423081530123REC11122233",
"scheduledAt": "2026-04-25T05:00:00Z",
"durationMinutes": 15
})
});
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', headers={
'Authorization': auth_header,
'Content-Type': 'application/json'
}, json={
"activityType": "CALL",
"subject": "신규 고객 첫 통화",
"recordId": "CRMRC1260423081530123REC11122233",
"scheduledAt": "2026-04-25T05:00:00Z",
"durationMinutes": 15
})
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' \
-H "Authorization: ${AUTH}" \
-H "Content-Type: application/json" \
-d '{"activityType": "CALL", "subject": "신규 고객 첫 통화", "recordId": "CRMRC1260423081530123REC11122233", "scheduledAt": "2026-04-25T05:00:00Z", "durationMinutes": 15}'

lightbulb

`scheduledAt`을 지정하면 해당 일시가 지나도 `outcome`은 `PENDING` 상태로 유지되며, 완료 처리는 별도로 `POST /crm-core/v1/activities/{activityId}/complete`를 호출해야 합니다. `dueDate`는 마감일로 캘린더 뷰에 표시됩니다.

lightbulb

**입력 검증**: `subject`에 빈 문자열을 입력하면 400 Bad Request 응답이 반환됩니다. `activityType`은 enum 검증이 적용되어 정의된 값 외에는 400 응답입니다.

lightbulb

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