멀티채널 라우팅 routing
채널 배열에 순서만 적으면 SMS 실패 시 푸시, 푸시 미설치 시 이메일로 이어집니다. 시간대·국가·수신 거부 규칙은 대시보드에서 코드 수정 없이 바꿉니다.
send_at 추가 · 8월 12일
채널마다 다른 SDK, 통신사 규격, 실패 처리를 직접 짜지 마세요. Relay API는 하나의 엔드포인트로 세 채널을 보내고, 실패하면 다음 채널로 넘깁니다.
1import { Relay } from '@relay-api/sdk';
2
3const relay = new Relay(process.env.RELAY_API_KEY);
4
5await relay.messages.send({
6 to: '+82-10-1234-5678',
7 channel: ['sms', 'push', 'email'], // 순서대로 폴백
8 template: 'order_shipped',
9 data: { orderId: 'A-20481', eta: '내일 오전' }
10});
1from relay_api import Relay
2
3relay = Relay(api_key=os.environ["RELAY_API_KEY"])
4
5relay.messages.send(
6 to="+82-10-1234-5678",
7 channel=["sms", "push", "email"], # 순서대로 폴백
8 template="order_shipped",
9 data={"order_id": "A-20481", "eta": "내일 오전"},
10)
1import "github.com/relay-api/relay-go/v2"
2
3client := relay.New(os.Getenv("RELAY_API_KEY"))
4
5_, err := client.Messages.Send(ctx, &relay.Message{
6 To: "+82-10-1234-5678",
7 Channel: []string{"sms", "push", "email"}, // 순서대로 폴백
8 Template: "order_shipped",
9 Data: relay.Data{"orderId": "A-20481", "eta": "내일 오전"},
10})
1curl https://api.relay.dev/v2/messages \
2 -H "Authorization: Bearer $RELAY_API_KEY" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "to": "+82-10-1234-5678",
6 "channel": ["sms", "push", "email"],
7 "template": "order_shipped",
8 "data": { "orderId": "A-20481", "eta": "내일 오전" }
9 }'
{
"id": "msg_01J5Y8K3Q2W7",
"status": "queued", "channel": "sms", "eta_ms": 180
}
아래 수치는 매월 1일 갱신되며, 원본은 공개 상태 페이지와 월간 운영 리포트에서 확인할 수 있습니다.
2026년 7월 1일~31일 · SMS·이메일·푸시 합산
5월 17일~8월 15일 · 상태 페이지 기록 기준
서울 리전 · 8월 8일~15일 · p99 412 ms
라우팅·템플릿·웹훅·재시도는 어느 팀이든 결국 만들게 되는 코드입니다. Relay가 이미 만들어 두었고, 대시보드에서 바로 확인됩니다.
채널 배열에 순서만 적으면 SMS 실패 시 푸시, 푸시 미설치 시 이메일로 이어집니다. 시간대·국가·수신 거부 규칙은 대시보드에서 코드 수정 없이 바꿉니다.
채널별·언어별 본문을 한 템플릿 ID로 관리합니다. 변수 누락은 발송 전에 400으로 걸러지고, 버전마다 미리보기와 롤백이 남습니다.
queued·delivered·opened·failed·bounced 이벤트를 HMAC-SHA256 서명과 함께 보냅니다. 엔드포인트가 5xx를 돌려주면 최대 5회, 지수 백오프로 다시 시도합니다.
통신사·SMTP·APNs 오류 코드를 분류해 재시도할 것과 즉시 폴백할 것을 나눕니다. 같은 메시지가 두 번 가지 않도록 멱등 키를 24시간 보관합니다.
좌우로 스크롤하면 전체 흐름이 보입니다
API 키 권한, 요청 스키마, 템플릿 변수를 확인합니다. 문제가 있으면 큐에 넣기 전에 4xx로 즉시 반환합니다.
채널 배열과 규칙(시간대·국가·수신 거부)을 평가해 첫 채널을 고릅니다. 평균 3 ms.
통신사·SMTP·APNs에 전달하고 응답 코드를 분류합니다. 재시도 또는 다음 채널 폴백을 자동 처리합니다.
상태 변화를 웹훅으로 앱에 돌려주고, 90일간 이벤트를 보관합니다. 대시보드에서 메시지 ID로 검색됩니다.
모두 OpenAPI 스펙에서 생성되고 같은 날 함께 배포됩니다. 타입 정의, 재시도, 멱등 키 헤더가 기본 포함되어 있습니다.
>implementation("dev.relay:relay-java:2.3.2")
Spring Boot 스타터 별도 제공
문서
무료 할당을 넘긴 발송량에 대해서만 건당 과금합니다. 월 발송량이 늘수록 단가는 자동으로 내려갑니다.
사이드 프로젝트와 개발 환경. 신용카드 없이 API 키를 바로 발급합니다.
프로덕션 서비스. 무료 할당은 그대로 두고, 초과분만 월말에 정산합니다.
전용 인프라, 계약 SLA, 데이터 리전 고정이 필요한 조직.
| 채널 | 무료 할당 / 월 | ~100만 건 | 100만~1,000만 건 | 1,000만 건+ |
|---|---|---|---|---|
| SMS국내 · 90바이트 이하 | 100건 (테스트) | ₩9.9 | ₩8.5 | ₩7.2 |
| LMS국내 · 2,000바이트 이하 | — | ₩29.0 | ₩26.0 | ₩23.0 |
| SMS 해외국가별 상이 · 미국 기준 | — | ₩68.0 | ₩62.0 | ₩55.0 |
| 이메일첨부 10MB · 전용 IP 별도 | 10,000건 | ₩0.90 | ₩0.70 | ₩0.50 |
| 푸시APNs · FCM · Web Push | 100,000건 | ₩0.12 | ₩0.09 | ₩0.06 |
| 웹훅 이벤트모든 채널 공통 | 무제한 | 무료 | 무료 | 무료 |
| 로그 보관 연장90일에서 1년으로 | — | ₩49,000 / 월 (프로젝트당) | ||
슬라이더를 움직이면 무료 할당과 구간 단가를 반영해 즉시 계산됩니다.
아래 상태 보드는 공개 상태 페이지와 같은 데이터입니다. 침투 테스트 보고서와 인증서 사본은 NDA 체결 후 영업일 2일 안에 보내드립니다.
99.95% · 99.99%월 가동률이 SLA에 미달하면 미달 폭에 따라 해당 월 사용료의 10%·25%·50%를 크레딧으로 돌려드립니다. 계산 기준과 제외 조건은 SLA 문서에 그대로 적혀 있습니다.
TLS 1.3 저장 AES-256-GCM키는 KMS에서 90일마다 회전되며, 수신자 번호·이메일은 로그에서 마스킹됩니다. API 키는 발급 시 한 번만 표시되고 이후에는 해시만 보관합니다.
기본 리전은 서울이며, 프로젝트 단위로 데이터가 저장·처리될 리전을 고정할 수 있습니다. 리전 간 자동 페일오버는 선택 사항입니다.
연 1회 외부 침투 테스트, 분기별 취약점 스캔을 수행합니다. 개인정보 처리 위탁 계약(DPA)은 표준 양식으로 즉시 체결됩니다.
가입하면 테스트 키가 즉시 발급됩니다. 문서의 모든 예제는 Node·Python·Go·cURL로 제공되고, 대시보드에서 요청과 응답을 그대로 재생할 수 있습니다.
RELAY_API_KEY=rly_test_7Fq2… # 테스트 키 · 발급 시 1회 표시npm i @relay-api/sdk # 또는 pip install relay-apiawait relay.messages.send({ to, channel: ['sms'], text: '안녕하세요' })