SMS 인증 API
SNSSIM API는 번호 구매, 코드 확인, 취소, 크레딧 및 가격 조회를 단일 HTTP 요청으로 처리합니다. 업계 표준인 handler_api 방식을 사용하므로 기존 프로그램에 주소와 API 키만 변경하면 바로 연결됩니다.
GET /stubs/handler_api.php
?api_key=API_KEY&action=getNumber
&service=telegram&country=gb
ACCESS_NUMBER:SS8Q2K7:447700900123
GET ...&action=getStatus&id=SS8Q2K7
STATUS_OK:48215- 업계 표준 방식
- handler_api
- API 키마다
- 분당 300번
- 나라 / 서비스
- 145 / 1,255
- 안에 코드 없으면 자동 환불
- 20분
업계 표준 방식
API 키마다
나라 / 서비스
안에 코드 없으면 자동 환불
API 키는 어떻게 받나요?
로그인 후 계정 화면의 API 메뉴에서 키를 생성하세요. 키는 생성 시 한 번만 표시되니 즉시 저장하세요. API는 웹 화면과 동일한 크레딧과 가격을 사용합니다.
기본 주소는 무엇인가요?
모든 요청은 동일한 주소에 api_key와 action을 추가해 GET 방식으로 전송합니다.
https://snssim.com/stubs/handler_api.php?api_key=API_KEY&action=...
어떤 요청을 보낼 수 있나요?
번호 구매부터 코드 확인, 취소, 크레딧 조회까지 총 7가지 요청이 가능합니다.
| action | 하는 일 | 응답 예 |
|---|---|---|
| getBalance | 크레딧 확인 | ACCESS_BALANCE:12.50 |
| getPrices&service=telegram&country=gb | 서비스·국가별 가격과 남은 번호 | {"gb":{"telegram":{"cost":0.207,"count":8877728}}} |
| getNumber&service=telegram&country=gb | 번호 구매 | ACCESS_NUMBER:ID:PHONE |
| getStatus&id=ID | 코드 확인 | STATUS_WAIT_CODE / STATUS_OK:CODE |
| setStatus&id=ID&status=8 | 번호 사용 취소 (코드 미수신 시 전액 환불) | ACCESS_CANCEL |
| setStatus&id=ID&status=3 | 동일 번호로 추가 인증 코드 받기 | ACCESS_RETRY_GET |
| setStatus&id=ID&status=6 | 사용 끝내기 | ACCESS_ACTIVATION |
요청 항목
| 이름 | 필수 | 설명 |
|---|---|---|
| api_key | 모두 | 계정 화면에서 만든 API 키 |
| action | 모두 | getBalance, getPrices, getNumber, getStatus, setStatus |
| service | getNumber | 서비스명 코드 (예시: telegram, whatsapp, google). 서비스 목록 페이지와 동일한 값이에요 |
| country | getNumber | 국가 코드 2자리 (예시: gb, us, id) |
| id | getStatus, setStatus | getNumber에서 발급한 번호 ID (N으로 시작) |
| status | setStatus | 8번 취소, 3번 코드 재요청, 6번 종료, 1번 준비 |
응답 글자와 뜻
응답은 간결한 문자로 제공됩니다. 크레딧 차감 여부도 함께 표시됩니다.
| 응답 | 뜻 | 돈 |
|---|---|---|
| ACCESS_NUMBER:ID:PHONE | 번호를 받았어요 | 번호 값이 빠져요 |
| STATUS_WAIT_CODE | 코드를 기다리는 중이에요 | 그대로 |
| STATUS_OK:CODE | 코드가 왔어요 | 결제 완료 |
| STATUS_WAIT_RETRY:CODE | 추가 인증 코드를 기다리고 있어요 (이전 코드 포함) | 추가 요금 없음 |
| STATUS_CANCEL | 취소됐거나 시간이 끝났어요 | 코드가 없었다면 환불됨 |
| ACCESS_CANCEL | 취소했어요 | 전액 환불 |
| ACCESS_RETRY_GET | 동일 번호로 한 번 더 코드 수신 대기 중이에요 | 추가 요금 없음 |
| ACCESS_ACTIVATION | 번호 사용을 끝냈어요 | 그대로 |
| NO_BALANCE | 크레딧을 충전하면 바로 받아요 | 빠지지 않음 |
| NO_NUMBERS | 현재 해당 국가 번호를 제공할 수 없어요 | 빠지지 않음 |
| NO_ACTIVATIONS | 열린 번호가 20개예요 | 빠지지 않음 |
| EARLY_CANCEL_DENIED | 인증 코드를 수신한 번호는 취소가 아닌 종료(6)를 선택하세요 | 그대로 |
| BAD_KEY | API 키가 맞지 않아요 | 빠지지 않음 |
| BAD_SERVICE / BAD_COUNTRY | 서비스 또는 국가 코드가 정확하지 않아요 | 빠지지 않음 |
| NO_ACTIVATION | 번호 ID 를 찾지 못했어요 | 그대로 |
| TOO_MANY_REQUESTS | 분당 300번을 넘었어요 | 빠지지 않음 |
API로 코드를 받는 순서는?
번호를 받고, 입력하고, 코드를 확인한 후 완료하는 4단계입니다.
- 1단계
번호 받기
getNumber를 통해 원하는 서비스와 국가를 선택해 번호를 발급받으세요.
action=getNumber&service=telegram&country=gb > ACCESS_NUMBER:SS8Q2K7:447700900123
- 2단계
번호 넣기
구매한 번호를 가입 페이지나 프로그램에 입력하세요.
+44 7700 900123
- 3단계
코드 확인
5초마다 getStatus를 호출해 코드 도착 여부를 확인하세요.
action=getStatus&id=SS8Q2K7 > STATUS_OK:48215
- 4단계
끝내기
코드를 입력한 후 setStatus 6으로 완료하세요. 20분 내에 코드가 없으면 자동 환불됩니다.
action=setStatus&id=SS8Q2K7&status=6 > ACCESS_ACTIVATION
언어별 예제
번호를 받고 코드를 기다린 후 완료하는 전체 과정입니다. 탭을 눌러 언어를 변경하세요.
# Balance
curl "https://snssim.com/stubs/handler_api.php?api_key=API_KEY&action=getBalance"
# Get a number (Telegram, United Kingdom)
curl "https://snssim.com/stubs/handler_api.php?api_key=API_KEY&action=getNumber&service=telegram&country=gb"
# ACCESS_NUMBER:N-8Q2K7XLM:447700900123
# Check the code (every 5 seconds)
curl "https://snssim.com/stubs/handler_api.php?api_key=API_KEY&action=getStatus&id=N-8Q2K7XLM"
# STATUS_WAIT_CODE or STATUS_OK:48215
# Finish (6) / Cancel (8, full refund before a code)
curl "https://snssim.com/stubs/handler_api.php?api_key=API_KEY&action=setStatus&id=N-8Q2K7XLM&status=6"import time, requests
BASE = "https://snssim.com/stubs/handler_api.php"
KEY = "API_KEY"
def call(**p):
return requests.get(BASE, params={"api_key": KEY, **p}, timeout=30).text
r = call(action="getNumber", service="telegram", country="gb")
if not r.startswith("ACCESS_NUMBER"):
raise SystemExit(r)
_, num_id, phone = r.split(":")
print("Number:", phone)
for _ in range(240): # 20 minutes
s = call(action="getStatus", id=num_id)
if s.startswith("STATUS_OK"):
print("Code:", s.split(":")[1])
call(action="setStatus", id=num_id, status=6)
break
time.sleep(5)// Node.js 18+
const BASE = "https://snssim.com/stubs/handler_api.php";
const KEY = "API_KEY";
const call = (p) => fetch(BASE + "?" + new URLSearchParams({ api_key: KEY, ...p })).then((r) => r.text());
const r = await call({ action: "getNumber", service: "telegram", country: "gb" });
if (!r.startsWith("ACCESS_NUMBER")) throw new Error(r);
const [, id, phone] = r.split(":");
console.log("Number:", phone);
for (let i = 0; i < 240; i++) {
const s = await call({ action: "getStatus", id });
if (s.startsWith("STATUS_OK")) {
console.log("Code:", s.split(":")[1]);
await call({ action: "setStatus", id, status: "6" });
break;
}
await new Promise((ok) => setTimeout(ok, 5000));
}<?php
$base = "https://snssim.com/stubs/handler_api.php";
$key = "API_KEY";
function call($p) { global $base, $key;
return file_get_contents($base . "?" . http_build_query(["api_key" => $key] + $p)); }
$r = call(["action" => "getNumber", "service" => "telegram", "country" => "gb"]);
if (strpos($r, "ACCESS_NUMBER") !== 0) exit($r);
[, $id, $phone] = explode(":", $r);
echo "Number: $phone\n";
for ($i = 0; $i < 240; $i++) {
$s = call(["action" => "getStatus", "id" => $id]);
if (strpos($s, "STATUS_OK") === 0) {
echo "Code: " . explode(":", $s)[1] . "\n";
call(["action" => "setStatus", "id" => $id, "status" => 6]);
break;
}
sleep(5);
}package main
import ("fmt"; "io"; "net/http"; "net/url"; "strings"; "time")
const base = "https://snssim.com/stubs/handler_api.php"
const key = "API_KEY"
func call(p url.Values) string {
p.Set("api_key", key)
r, _ := http.Get(base + "?" + p.Encode())
defer r.Body.Close()
b, _ := io.ReadAll(r.Body)
return string(b)
}
func main() {
r := call(url.Values{"action": {"getNumber"}, "service": {"telegram"}, "country": {"gb"}})
if !strings.HasPrefix(r, "ACCESS_NUMBER") { fmt.Println(r); return }
f := strings.Split(r, ":")
fmt.Println("Number:", f[2])
for i := 0; i < 240; i++ {
s := call(url.Values{"action": {"getStatus"}, "id": {f[1]}})
if strings.HasPrefix(s, "STATUS_OK") {
fmt.Println("Code:", strings.Split(s, ":")[1])
call(url.Values{"action": {"setStatus"}, "id": {f[1]}, "status": {"6"}})
return
}
time.Sleep(5 * time.Second)
}
}import java.net.URI; import java.net.URLEncoder; import java.net.http.*;
import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.stream.Collectors;
public class SNSSIM {
static final String BASE = "https://snssim.com/stubs/handler_api.php", KEY = "API_KEY";
static final HttpClient http = HttpClient.newHttpClient();
static String call(Map<String, String> p) throws Exception {
String q = p.entrySet().stream().map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8)).collect(Collectors.joining("&"));
return http.send(HttpRequest.newBuilder(URI.create(BASE + "?api_key=" + KEY + "&" + q)).build(), HttpResponse.BodyHandlers.ofString()).body();
}
public static void main(String[] a) throws Exception {
String r = call(Map.of("action", "getNumber", "service", "telegram", "country", "gb"));
if (!r.startsWith("ACCESS_NUMBER")) { System.out.println(r); return; }
String[] f = r.split(":");
System.out.println("Number: " + f[2]);
for (int i = 0; i < 240; i++) {
String s = call(Map.of("action", "getStatus", "id", f[1]));
if (s.startsWith("STATUS_OK")) { System.out.println("Code: " + s.split(":")[1]); call(Map.of("action", "setStatus", "id", f[1], "status", "6")); return; }
Thread.sleep(5000);
}
}
}using System.Net.Http;
const string Base = "https://snssim.com/stubs/handler_api.php";
const string Key = "API_KEY";
var http = new HttpClient();
async Task<string> Call(string q) => await http.GetStringAsync($"{Base}?api_key={Key}&{q}");
var r = await Call("action=getNumber&service=telegram&country=gb");
if (!r.StartsWith("ACCESS_NUMBER")) { Console.WriteLine(r); return; }
var f = r.Split(':');
Console.WriteLine($"Number: {f[2]}");
for (var i = 0; i < 240; i++)
{
var s = await Call($"action=getStatus&id={f[1]}");
if (s.StartsWith("STATUS_OK"))
{
Console.WriteLine($"Code: {s.Split(':')[1]}");
await Call($"action=setStatus&id={f[1]}&status=6");
break;
}
await Task.Delay(5000);
}API 자주 묻는 질문
API에서 145개국 1,255개 서비스 번호를 웹 화면과 동일한 가격으로 제공합니다.
- SMS 인증 API란 무엇인가요?
- 프로그램 내에서 가상번호 구매, 인증 코드 확인, 취소를 HTTP 요청으로 처리하는 기능입니다. SNSSIM API는 업계 표준인 handler_api 방식을 사용합니다.
- 다른 SMS 인증 사이트에서 사용하던 프로그램을 그대로 사용할 수 있나요?
- handler_api 방식을 사용하는 프로그램이라면 기본 주소와 API 키만 변경하면 바로 연결됩니다.
- API 요금은 따로 있나요?
- 차이가 없습니다. API와 웹 화면은 동일한 크레딧과 가격을 사용합니다.
- 요청은 몇 회까지 가능한가요?
- API 키당 분당 최대 300회 요청 가능합니다. 초과 시 TOO_MANY_REQUESTS 오류가 발생하며 크레딧은 차감되지 않습니다.
- API로 산 번호도 환불되나요?
- 예. 20분 내에 코드가 도착하지 않으면 API로 구매한 번호도 크레딧으로 자동 환불됩니다.
- API 키는 어디서 만드나요?
- 로그인 후 계정 화면의 API 메뉴에서 생성하세요. 키는 생성 시 한 번만 표시되니 즉시 저장하세요.