수신거부 동기화 API 레퍼런스

080·수신거부 링크로 수집된 수신거부 목록을 내려받고, 자사에서 받은 수신거부를 등록·정정 (7개 엔드포인트)

참고인증
모든 Service API 요청에는 X-API-KEY 헤더를 포함해야 합니다. API Key는 콘솔 > 개발자 > API 키 관리에서 발급받으며, 조직별 허용 IP(화이트리스트)에서만 호출할 수 있습니다. Service API 이용에는 API_ACCESS 기능(Pro 이상 플랜)이 필요합니다. 공통 규칙은 API 개요를 참고하세요.
주의메시징 애드온 전용
이 문서의 모든 엔드포인트(조회·등록·삭제·확인)는 메시징 애드온이 활성화된 조직만 호출할 수 있습니다. 애드온이 없으면 403FEATURE_NOT_AVAILABLE 코드가 반환됩니다. 수신자가 080·수신거부 링크로 거부 의사를 밝히는 경로는 애드온과 무관하게 항상 동작합니다 — 애드온은 조직이 그 목록을 자기 시스템으로 동기화하는 이 API에만 필요합니다.
TIP어디에 쓰나
080 무료수신거부와 수신거부 링크로 들어온 거부는 저희 서버에 쌓입니다. 자사 CRM이나 자체 발송 시스템을 따로 운영한다면 그쪽에도 반영해야, 저희를 거치지 않고 나가는 발송까지 함께 막을 수 있습니다. 이 API는 그 미러링을 위한 것입니다. 저희를 통한 발송은 이 API와 무관하게 발송 시점에 자동으로 차단됩니다.

커서 규약

목록은 커서(cursor) 방식입니다. 페이지 번호가 아니라 "여기까지 받았다"는 표식을 주고받습니다. 응답의 nextCursor를 저장해 두었다가 다음 호출에 그대로 넘기면 그 이후 신규분만 받습니다.

  • 커서는 불투명한 문자열입니다. 내부 값을 해석하거나 직접 만들지 마세요.
  • 채널이 다른 커서를 넘기면 400으로 거절합니다.
  • 총건수는 목록 응답에 없습니다. 필요하면 워터마크를 쓰세요.
  • 등록 직후 몇 초간은 목록에 나타나지 않을 수 있습니다(정합성 보정). 다음 호출에서 반드시 포함됩니다.

GET /api/v1/service/messaging/unsubscribes

커서 이후의 수신거부를 오래된 것부터 내려줍니다.

파라미터타입필수설명
channelString-SMS(기본) / EMAIL / WHATSAPP
cursorString-이전 응답의 nextCursor. 없으면 처음부터
limitInteger-기본 500, 최대 1000
curl "https://fplink.net/api/v1/service/messaging/unsubscribes?channel=SMS&limit=500" \
  -H "X-API-KEY: YOUR_API_KEY"
{
  "channel": "SMS",
  "items": [
    {
      "id": 84213,
      "channel": "SMS",
      "phone": "01012345678",
      "method": "080",
      "source": "080:0801234567",
      "unsubscribedAt": "2026-09-04T02:11:00Z"
    }
  ],
  "nextCursor": "U01TOjg0MjEz",
  "hasMore": true
}

hasMoretrue인 동안 nextCursor를 넘겨 반복 호출하면 전체를 받을 수 있습니다. method080(무료 전화), LINK(수신거부 링크), CSV(콘솔 등록) 등입니다.

GET /api/v1/service/messaging/unsubscribes/watermark

현재 최신 커서입니다. 저장해 둔 커서와 값이 같으면 받을 것이 없다는 뜻이므로 목록을 호출하지 않아도 됩니다. 주기적으로 확인만 하는 용도라면 이 엔드포인트를 먼저 호출하세요.

파라미터타입필수설명
channelString-SMS(기본) / EMAIL / WHATSAPP
withTotalBoolean-총건수를 함께 받을지(기본 false). 계산 비용이 있어 최대 60초 이전 값일 수 있습니다
{
  "channel": "SMS",
  "latestCursor": "U01TOjg0MjEz",
  "asOf": "2026-09-04T02:20:11Z"
}

GET /api/v1/service/messaging/unsubscribes/deletions

삭제된 수신거부 항목입니다. 목록 API는 존재하는 항목만 내려주므로, 잘못 등록된 건을 정정 삭제한 사실은 이 피드로만 알 수 있습니다. 커서 사용법은 목록과 같습니다.

{
  "channel": "SMS",
  "items": [
    { "id": 12, "channel": "SMS", "phone": "01012345678", "sourceId": 84213, "deletedAt": "2026-09-05T01:00:00Z" }
  ],
  "nextCursor": "U01TOjEy",
  "hasMore": false
}
주의삭제는 sourceId가 일치할 때만 적용하세요
같은 번호가 삭제된 뒤 다시 수신거부로 등록될 수 있습니다. 이때 낡은 삭제 항목을 그대로 적용하면 방금 받은 재등록이 지워져 차단이 풀립니다. 보관 중인 레코드의 id가 삭제 항목의 sourceId와 같을 때만 지우세요.
주의410 응답 — 전체 다시 받기
삭제 이력은 90일간 보관합니다. 그보다 오래된 커서로 호출하면 410 Gone"resyncRequired": true를 응답합니다. 이 경우 해당 채널을 커서 없이 처음부터 다시 받아 목록을 통째로 교체하세요. 응답 본문에 resyncRequired가 포함된 경우에도 같습니다 (콘솔에서 대량 삭제가 일어난 경우).

권장 동기화 절차

  1. 최초 1회: 커서 없이 /unsubscribeshasMore=false가 될 때까지 반복 호출해 전체를 받습니다.
  2. 주기 실행(예: 5분): /watermark를 호출해 저장한 커서와 비교합니다. 같으면 종료합니다.
  3. 다르면 /unsubscribes?cursor=로 신규분을 받고 커서를 갱신합니다.
  4. 이어서 /deletions?cursor=로 삭제분을 받아 sourceId가 일치하는 항목만 지웁니다.
참고호출 한도
이 조회 계열은 다른 Service API와 분리된 한도를 씁니다(기본 분당 60회). 초기 전체 동기화를 하더라도 같은 API 키의 다른 호출(URL 생성 등)에 영향을 주지 않습니다. 한도를 넘으면 429Retry-After 헤더를 응답합니다.

등록·삭제

자사 CRM·콜센터에서 접수한 수신거부를 저희 쪽에도 반영할 때 씁니다. 등록하면 그 시점부터 저희를 통한 광고성 발송에서 자동으로 제외됩니다.

참고값 형식
전화번호는 숫자만 남겨 저장합니다(010-1234-567801012345678). 하이픈·공백이 있어도 됩니다. 이메일은 소문자로 맞춥니다. 조회·삭제 시 전화번호는 국내 표기와 국제 표기(8210…)를 모두 대조하므로 어느 쪽으로 보내도 찾습니다.

POST /api/v1/service/messaging/unsubscribes

curl -X POST https://fplink.net/api/v1/service/messaging/unsubscribes \
  -H "X-API-KEY: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"channel":"SMS","value":"010-1234-5678","source":"crm"}'

unsubscribedAt(선택)으로 실제 거부 시점을 지정할 수 있습니다. 없으면 요청 시각으로 기록합니다. 이미 등록된 값이면 duplicated로 응답하며 오류가 아닙니다.

POST /api/v1/service/messaging/unsubscribes/bulk

요청당 최대 1,000건입니다. 더 많으면 나눠 호출하세요.

curl -X POST "https://fplink.net/api/v1/service/messaging/unsubscribes/bulk" \
  -H "X-API-KEY: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"channel":"SMS","items":[{"value":"01011112222"},{"value":"01033334444"}]}'
{
  "channel": "SMS",
  "accepted": 1,
  "duplicated": 1,
  "invalid": [ { "index": 5, "value": "123", "reason": "PHONE_FORMAT" } ]
}

형식이 틀린 항목이 있어도 나머지는 등록됩니다 — invalid에 그 항목의 위치와 사유가 담깁니다. ?async=true로 호출하면 202와 함께 jobId를 즉시 돌려주고, 진행 상황은 GET /api/v1/service/messaging/contacts/bulk-jobs/{jobId}로 조회합니다.

DELETE /api/v1/service/messaging/unsubscribes

잘못 등록했거나 재동의를 받은 경우의 정정용입니다. id가 아니라 값으로 지웁니다.

curl -X DELETE "https://fplink.net/api/v1/service/messaging/unsubscribes?channel=SMS&value=01012345678" \
  -H "X-API-KEY: YOUR_API_KEY"

DELETE /api/v1/service/messaging/unsubscribes/bulk

curl -X DELETE "https://fplink.net/api/v1/service/messaging/unsubscribes/bulk" \
  -H "X-API-KEY: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"channel":"SMS","values":["01011112222","01033334444"]}'

요청당 최대 1,000건입니다. 응답의 deleted·notFound로 결과를 확인하세요.

주의삭제는 신중히
수신거부 기록은 "언제부터 거부했는가"에 대한 근거입니다. 전체 삭제 API는 제공하지 않으며, 삭제 요청은 감사 기록에 남습니다. 삭제해도 주소록의 광고 수신 동의는 켜지지 않습니다 — 수신거부와 주소록 동의는 별개로 관리됩니다.

GET /api/v1/service/messaging/unsubscribes/check

한 건만 확인합니다. 발송 직전 조회용입니다.

curl "https://fplink.net/api/v1/service/messaging/unsubscribes/check?channel=SMS&value=01012345678" \
  -H "X-API-KEY: YOUR_API_KEY"
# {"channel":"SMS","unsubscribed":true}

웹훅으로 즉시 받기

주기적으로 확인하는 대신, 변경이 생길 때 저희가 알려 드릴 수 있습니다. 콘솔 > 개발자 > 웹훅에서 URL을 등록하고 수신거부 동기화 이벤트를 선택하세요.

이벤트발생 시점
unsubscribe.created수신거부가 새로 등록될 때
unsubscribe.deleted수신거부가 삭제될 때 (sourceId 포함)
unsubscribe.bulk_changed한 번에 많이 바뀌었을 때 — 건별 대신 요약 1건
{
  "event": "unsubscribe.created",
  "delivery_id": "9f1c…",
  "organization_id": 12,
  "data": {
    "id": 84213,
    "channel": "SMS",
    "phone": "01012345678",
    "method": "080",
    "unsubscribedAt": "2026-09-04T02:11:00Z",
    "cursor": "U01TOjg0MjEz"
  }
}
주의웹훅은 신호, 목록 API가 기준
전달 순서는 보장되지 않으며 네트워크 사정으로 유실될 수 있습니다. 같은 이벤트가 두 번 올 수도 있으니 delivery_id로 중복을 걸러 주세요. 최종 정합성은 커서 API로 맞추는 것을 권장합니다 — payload의 cursor를 그대로 목록 API에 넘기면 그 지점부터 이어받을 수 있습니다. 발화까지는 최대 5분 걸립니다.