POST .../dm — 인스타 DM 발송
미비한 일정 대상자 한 명에게 신청서의 인스타 핸들로 AutoDM 을 보내고 연락 이력을 남깁니다.
인스타 DM 발송
미비한 일정 대상자 한 명에게 신청서에 적힌 인스타 핸들로 @glow.b_kor 계정이 DM 을 보냅니다(AutoDM).
실제로 전송되면 연락 이력이 자동으로 남습니다(method: INSTAGRAM_DM) — 문자 발송(pending-sms)과 같은 방식, 1인 1DM 입니다.
- 인스타그램 캠페인만 보냅니다. 틱톡·네이버 등 다른 캠페인은
400으로 거절합니다 - 크리에이터 DM 인증과 무관합니다. 인증 여부·수신 거부 기록을 보지 않고 항상 신청서 핸들로 보냅니다
- 발송 계정은 고르지 않습니다 — test 는
test_glowb_kor, prod 는prod_glowb_kor - 보낼 수 없으면
400과 사유를 돌려줍니다(아래 표)
신청서 핸들은 본인 확인을 거치지 않은 값입니다. 크리에이터가 적어낸 핸들을 그대로 쓰므로
오타나 대행 입력이면 엉뚱한 사람에게 갑니다. 우리에게 말을 건 적 없는 상대에게는 메타 API 로
보낼 수 없어((#10) 허용되는 창 외부) 인스타 앱을 직접 조작하는 AutoDM 만 씁니다.
파트너십 메시지로 보내려면 이 API 대신 DM 이력 위젯을 씁니다 — 대화 상대 목록을
applicationId·folder=PARTNERSHIP 으로 찾고 대화 상대에게 보내기에 applicationId 를 실어 보내면,
보내진 뒤 같은 연락 이력(INSTAGRAM_DM)이 남습니다. 파트너십 대화가 없으면 목록이 비어 옵니다.
HTTP 요청
POST /ai/admin/campaigns/{campaignNo}/pending-participants/{applicationId}/dm
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | int | 예 | 캠페인 번호 |
applicationId | long | 예 | 신청 ID (목록 API 의 applicationId). 이 캠페인의 신청이어야 합니다 |
Request Body
{
"content": "안녕하세요! 1차 제작물이 아직 제출되지 않았습니다. 확인 부탁드립니다.",
"pendingCase": "FIRST_REVIEW_NOT_SUBMITTED"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
content | string | 예 | 보낼 문구 (최대 2000자) |
pendingCase | PendingCase | 아니오 | 미처리 케이스. 연락 이력에 함께 남습니다 |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "인스타 DM 발송 요청 접수",
"data": {
"applicationId": 31234,
"handle": "beom710",
"instance": "test_glowb_kor",
"runId": "3f6d2c1a-9d1e-4a5b-8c7f-0e1d2c3b4a59",
"queued": false
}
}| 필드 | 설명 |
|---|---|
handle | 실제로 보낸 인스타 핸들(신청서에서 뽑은 값) |
runId | AutoDM 런 식별자 — AutoDM 런 상세(GET /ai/admin/auto-dm/runs/{runId})에서 결과 확인 |
queued | true 면 앞선 발송이 끝나길 기다리는 중, false 면 즉시 시작됨 |
instanceBlocked | 발송 계정이 차단·확인중이라 대기열에서 멈춘 경우만 true — 풀어 주기 전엔 안 나갑니다 |
성공 응답은 발송 큐에 올라갔다는 뜻이지 도착했다는 뜻이 아닙니다. 건당 40~90초가 걸리고,
실제 결과(success/failed/skip)는 AutoDM 런 상세(GET /ai/admin/auto-dm/runs/{runId})에서 확인합니다.
Slack #자동dm-알림 에 이 DM 한 통의 결과(완료·실패·미발송과 사유)가 올라옵니다 — 아래 Slack 알림 참고.
여러 명에게 연달아 보내면 요청마다 런이 하나씩 생기고, 인스턴스(@glow.b_kor)가 한 런씩 순서대로 처리합니다.
뒤 요청은 queued: true 로 대기했다가 자동으로 나갑니다.
연락 이력
AutoDM 이 전송 성공을 알려 오면 연락 이력(CONTACT)을 하나 남깁니다. 응답 시점엔 아직 안 나갔으므로 응답엔 이력 ID 가 없습니다. 실패·미발송·취소·차단으로 안 나간 DM 은 이력을 남기지 않습니다 — 그 결과는 Slack 알림으로 확인합니다.
| 필드 | 값 |
|---|---|
method | INSTAGRAM_DM |
summary | 인스타 DM 발송 (@핸들) |
note | 실제로 보낸 문구 |
pendingCase | 요청의 pendingCase |
actorId | 요청한 관리자 |
에러 응답
보낼 수 없으면 400(REQUEST_ARGUMENT_INVALID)과 사유를 돌려줍니다.
| 사유 | 설명 |
|---|---|
| 신청을 찾을 수 없습니다 | 없는 applicationId |
| 캠페인 N 의 신청이 아닙니다 | 경로의 campaignNo 와 신청의 캠페인이 다름 |
| 인스타그램 캠페인이 아니라 DM 대상이 아닙니다 | 캠페인이 틱톡·네이버 등 |
| 인스타그램 계정으로 신청한 건이 아니라 DM 대상이 아닙니다 | 인스타 캠페인인데 신청서 링크가 인스타가 아님 — 실제로 있다 |
| 신청서에서 인스타그램 핸들을 읽을 수 없습니다 | 링크에서 계정 이름을 뽑지 못함 |
| test 환경이라 허용 목록 밖의 계정에는 보내지 않습니다 | 아래 참고 |
| 환경(test/prod)을 알 수 없어 발송 인스턴스를 정할 수 없습니다 | 로컬 등 |
content 가 비었으면 요청 검증 단계에서 400 입니다. 인증 실패·관리자 아님은 401 / 403 입니다.
test 환경에서는 허용 목록의 핸들만 실제로 보냅니다. test 신청서 핸들이 실존 계정으로 오염돼
있어서입니다(예: realdonaldtrump). 허용 목록은 glowb.tester3·beom710·lucky_rabbit_0710 입니다.
prod 에서는 보지 않습니다.
Slack 알림
#자동dm-알림 에 autoDM-bot 이 이 DM 한 통의 결과를 올립니다 — 알리고 문자·이메일 전송 알림과 같은 모양입니다.
test·prod 가 한 채널을 쓰므로 맨 앞에 [TEST] / [PROD] 가 붙습니다.
| 알림 | 언제 |
|---|---|
| ✅ 인스타 DM 발송 완료 | 전송됨 |
| ❌ 인스타 DM 발송 실패 | 인스타가 전송을 거부(빨간 점) |
| ⚠️ 인스타 DM 미발송 | 계정 없음·비공개 계정·DM 차단·엔진 오류 |
| ❌ 인스타 DM 미발송 (중단) | 결과 없이 끝남 — 계정 제한·관리자 중지·VM 응답 없음·대기 중 취소 등, 사유와 조치 포함 |
| ❓ 인스타 DM 발송 확인 필요 | 차단을 감지한 순간 처리 중이던 대상 — 실제로는 나갔을 수 있음 |
| ⚠️ AutoDM 발송 계정 차단 | 계정 제한으로 멈춤 — 풀어 주기 전엔 뒤 DM 이 대기 |
| ⏳ AutoDM 발송 지연 | 인스턴스·VM 연결 실패로 자동 재시도 중(런당 한 번) |
| ⏸️ AutoDM 발송 대기 | 발송 계정이 차단·확인중이라 대기열에서 멈춤 |
각 알림에는 수신자(@핸들·크리에이터 이름), 보낸 문구, 캠페인, 사유·조치, 발송 경로·요청자, 발송 계정이 담깁니다.