PortSMS

API 문서

엔드포인트는 https://portsms.com/api/v1. 모든 응답은 JSON.

인증

모든 요청에 Authorization: Bearer <token> 헤더를 포함합니다. 토큰은 가입시 1회 발급. 분실하면 복구 불가.

Authorization: Bearer tok_01HJZABCDE2YS83F0GQV9JXM1R

POST /send

단일 혹은 여러 수신번호로 메시지 발송. 1건 요청에 최대 1,000 수신자.

POST /api/v1/send
Content-Type: application/json

{
  "to": ["+14155550123", "+447700900123"],
  "from": "PortSMS",
  "text": "코드: 739215"
}

응답

{
  "id": "msg_01HJZ27YVM3QX0WK6PCB4F1R9A",
  "accepted": 2,
  "rejected": 0,
  "cost_usd": "0.0177",
  "status_url": "/api/v1/status/msg_01HJZ27YVM3QX0WK6PCB4F1R9A"
}

GET /status/:id

발송 단일 ID의 수신자별 상태.

GET /api/v1/status/msg_01HJZ...

{
  "id": "msg_01HJZ...",
  "created_at": "2026-10-12T20:30:14Z",
  "parts": 1,
  "cost_usd": "0.0177",
  "recipients": [
    { "to": "+14155550123", "status": "delivered",  "ms_to_deliver": 842 },
    { "to": "+447700900123", "status": "delivering" }
  ]
}

GET /balance

현재 토큰의 잔액 (USD).

GET /api/v1/balance

{ "balance_usd": "412.85", "credit_usd": "412.85" }

Webhook

가입시 지정한 URL로 발송 상태 변경을 푸시. X-PortSMS-Signature: t=<ts>,v1=<hex> 헤더로 HMAC-SHA256 서명 (timestamp.body).

POST https://your-site.com/webhook
X-PortSMS-Signature: t=1697083214,v1=4a9b2c...

{
  "event": "message.delivered",
  "id": "msg_01HJZ...",
  "recipient": "+14155550123",
  "ms_to_deliver": 842,
  "at": "2026-10-12T20:30:16Z"
}

이벤트: message.sent, message.delivered, message.failed, balance.low. 재시도 8회 (지수 백오프).

오류 코드

  • 401 unauthorized | 토큰 누락 또는 폐기됨
  • 402 insufficient_credit | 크레딧 부족
  • 400 bad_request | 번호/문구 형식 오류
  • 429 rate_limited | 분당 300회 초과 (Retry-After 헤더 참조)
  • 502 route_down | 해당 국가 라우트 일시 불가 (자동 재시도)

제한

  • 분당 300회 요청 (/send)
  • 요청당 수신자 최대 1,000
  • 문구 최대 10 parts (1,530자)
  • 토큰 1개당 하루 50만 건 (초과시 수동 승인)