공급자 관리
공급자(Provider) 계정은 채널별 발송 자격증명입니다. 알리고·SOLAPI·Resend 같은 외부 발송 서비스의 API 키를 워크스페이스에 등록해 두면, 발송 요청이 라우팅 규칙을 따라 해당 공급자로 전달됩니다. 등록한 공급자를 채널에 연결하고 우선순위·폴백을 구성하는 방법은 라우팅과 폴백을 참고하세요.
공급자 관리 엔드포인트는 대시보드 API입니다.
Authorization: Bearer 헤더에 대시보드 액세스 토큰을 담아 호출하며, 토큰 발급은 대시보드 인증을 참고하세요.
providerKind 목록
providerKind는 “어느 서비스로 어느 채널을 보내는가”를 나타내는 값으로, 등록 후 변경할 수 없습니다.
발송 채널은 서버가 providerKind에서 자동으로 도출합니다.
| providerKind | 채널 | 설명 |
|---|---|---|
aligo_kakao | kakao_alimtalk | 알리고 카카오 알림톡 |
solapi_kakao | kakao_alimtalk | SOLAPI 카카오 알림톡 |
aligo_sms | sms | 알리고 SMS |
solapi_sms | sms | SOLAPI SMS |
fcm | push_fcm | Firebase Cloud Messaging 푸시 |
resend_email | email | Resend 이메일 |
aws_ses_email | email | AWS SES 이메일 |
mailersend_email | email | MailerSend 이메일 |
slack_webhook | slack_webhook | Slack Incoming Webhook |
slack_bot | slack_bot | Slack Bot |
discord_webhook | discord_webhook | Discord Webhook |
discord_bot | discord_bot | Discord Bot |
configJson 키
공급자 자격증명은 configJson에 담아 등록합니다.
값은 전부 문자열이며, 저장 시 전체가 암호화되고 이후 어떤 조회 API에서도 반환되지 않습니다.
발송 어댑터가 실제로 읽는 키는 다음과 같습니다.
| providerKind | 필수 키 | 선택 키 |
|---|---|---|
aligo_sms | aligo_user_id, aligo_api_key, aligo_sender | — |
aligo_kakao | aligo_user_id, aligo_kakao_api_key(없으면 aligo_api_key 사용), aligo_sender | — |
solapi_sms | solapi_api_key, solapi_api_secret, solapi_sender | — |
solapi_kakao | solapi_api_key, solapi_api_secret, solapi_sender | — |
fcm | fcm_service_account_json (서비스 계정 JSON 문자열) | — |
resend_email | resend_api_key, resend_from_email | — |
aws_ses_email | aws_access_key_id, aws_secret_access_key, aws_region, aws_ses_from_email | aws_ses_from_name, aws_ses_configuration_set |
mailersend_email | mailersend_api_key, mailersend_from_email | mailersend_from_name (기본값 Project Noti) |
slack_webhook | slack_webhook_url | — |
slack_bot | slack_bot_token | — |
discord_webhook | discord_webhook_url | — |
discord_bot | discord_bot_token | — |
- 알림톡(
aligo_kakao,solapi_kakao)의 발신프로필 키와 템플릿 ID는 configJson이 아니라 승인된 알림톡 템플릿에서 발송 시 자동 주입됩니다. - Slack·Discord의 webhook 방식(
slack_webhook,discord_webhook)은 등록한 URL에 연결된 채널로 보내므로recipient.address가 필요 없습니다. bot 방식(slack_bot,discord_bot)은 보낼 채널을recipient.address에 담아야 하며(Slack은 채널 이름·ID, Discord는 채널 ID), 기본 채널을 configJson에 지정하는 키는 없어 채널은 매 발송의recipient.address로만 결정됩니다. - 필수 키가 빠진 채 발송하면 해당 시도가
invalid_request로 실패합니다. 등록 시점에는 키를 검증하지 않으므로, 등록 후 아래 test-send로 설정을 점검하는 것을 권장합니다.
공급자 목록 조회
워크스페이스의 공급자를 생성 순으로 조회합니다. (역할: owner / admin / operator / viewer)
{
"providers": [
{
"id": "3f2a9c1e-…",
"providerKind": "solapi_sms",
"displayName": "SOLAPI 운영",
"enabled": true,
"createdAt": "2026-07-01T09:00:00.000Z",
"updatedAt": "2026-07-01T09:00:00.000Z",
"quota": {
"period": "month",
"limit": null,
"used": 0,
"remainingCredit": 52340,
"currency": "KRW"
}
}
]
}configJson은 응답에 포함되지 않습니다.
quota는 공급자의 잔여 발송량(잔액) 입니다.
SOLAPI(잔액, currency: "KRW")와 알리고(SMS·LMS·MMS 잔여 건수 합산, currency: "count")만 실제 값을 제공하며, 그 외 공급자이거나 조회에 실패하면 quota 필드 자체가 생략됩니다.
조회 결과는 60초간 캐시됩니다.
공급자 등록
새 공급자를 등록합니다. (역할: owner / admin / operator)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
providerKind | string | 필수 | 위 providerKind 목록의 값 |
displayName | string | 필수 | 표시 이름. 최대 120자 |
configJson | object | 선택 | 자격증명 키-값(문자열). 암호화되어 저장됩니다 |
enabled | boolean | 선택 | 활성 여부. 미지정 시 true |
curl -X POST https://api.posmit.io/v1/providers \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"providerKind": "solapi_sms",
"displayName": "SOLAPI 운영",
"configJson": {
"solapi_api_key": "NCS…",
"solapi_api_secret": "X0…",
"solapi_sender": "0212345678"
}
}'{
"provider": {
"id": "3f2a9c1e-…",
"providerKind": "solapi_sms",
"displayName": "SOLAPI 운영",
"enabled": true
}
}응답에도 configJson은 포함되지 않습니다.
| 코드 | 의미 |
|---|---|
NOTI-40000 | 요청 본문 검증 실패(providerKind 목록 외 값, displayName 120자 초과 등) |
단건 발송 (test-send)
라우팅·폴백 없이 지정한 공급자 하나로만 1건을 동기 발송합니다. (역할: owner / admin / operator)
채널은 공급자의 providerKind에서 도출되며, 발송 결과는 일반 발송과 동일하게 발송 요청·시도 이력에 기록됩니다.
| mode | 용도 | 비활성 공급자 |
|---|---|---|
test | 설정 점검용 1건. 이력의 metadata에 test: "true"로 마킹됩니다 | 허용 |
instance | 실제 1건 즉시 발송 | 409 거부 |
mode: "test"도 실제 발송이 나갑니다.
두 모드의 차이는 비활성 공급자 허용 여부와 이력 마킹뿐입니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
mode | string | 필수 | test 또는 instance |
recipient.address | string | 조건부 | 수신자 주소(전화번호·이메일·FCM 토큰 등). 최대 320자. webhook 채널(slack_webhook, discord_webhook)만 생략 가능 |
recipient.name | string | 선택 | 수신자 이름. 최대 120자 |
content.text | string | 조건부 | 본문. 알림톡 외 모든 채널에서 필수 |
content.title | string | 선택 | 제목. 최대 200자 |
content.templateCode | string | 조건부 | 알림톡에서 필수. 이 공급자에 바인딩된 승인(APPROVED) 템플릿 코드 |
content.templateVariables | object | 선택 | 템플릿 변수 키-값 |
채널별 주의사항은 다음과 같습니다.
- 알림톡: 자유 본문 발송이 불가하므로
content.templateCode가 필수이며,content.text는 무시되고 승인 템플릿 본문에 변수를 치환해 발송합니다. 템플릿이 미승인이거나 없으면 400, 같은 코드의 템플릿이 다른 공급자 소유이면 403이 반환됩니다. - webhook 채널: 등록된 URL로 발송되므로
recipient.address를 생략합니다. 단,slack_bot·discord_bot채널은 주소가 필요합니다. - 이메일: 수신 차단 목록(suppression)에 있는 주소는 점검 발송이라도 거부되어 502가 반환됩니다.
curl -X POST https://api.posmit.io/v1/providers/3f2a9c1e-…/test-send \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "test",
"recipient": { "address": "01012345678" },
"content": { "text": "Posmit 발송 설정 점검 메시지입니다." }
}'{
"requestId": "b7d0c4a2-…",
"status": "sent",
"mode": "test",
"channel": "sms",
"providerMessageId": "M4V2025…",
"acceptedAt": "2026-07-11T09:00:00.000Z"
}| 코드 | HTTP | 의미 |
|---|---|---|
NOTI-40000 | 400 | 본문 검증 실패, content.text·recipient.address 누락, 알림톡 템플릿 누락·미승인 |
NOTI-40300 | 403 | 템플릿이 이 공급자에 바인딩되지 않음 (Template is not bound to this provider) |
NOTI-40400 | 404 | 공급자가 없거나 다른 워크스페이스 소유 |
NOTI-40900 | 409 | mode: "instance"인데 공급자가 비활성 상태 |
NOTI-50200 | 502 | 공급자 발송 실패. 이력에는 failed로 기록되며, detail에 실패 사유가 담깁니다 |
공통 에러
모든 공급자 관리 엔드포인트는 실패 시 application/problem+json 형식으로 응답합니다.
| 코드 | HTTP | 의미 |
|---|---|---|
NOTI-40100 | 401 | 액세스 토큰 누락·만료·위조 |
NOTI-40300 | 403 | 역할 부족(viewer의 등록·발송 시도 등) 또는 워크스페이스 미선택 |
에러 형식의 자세한 내용은 에러 처리를 참고하세요.