← 블로그 목록
가이드2026-06-01

Twilio 한국 070 안 된다 — ClawOps로 5분 마이그레이션

Twilio Console에서 Phone Numbers → Buy a Number → Country: Korea 를 선택하면 "No numbers available" 이 뜬다. Toll-Free·Mobile·Local 모두 같다. 빌더 입장에서 한국 진출이 막힌다. 이 글은 Twilio 코드 베이스를 그대로 두면서 한국 070 번호와 통화 흐름만 ClawOps 로 옮기는 hybrid 패턴, 그리고 전면 마이그레이션 코드 diff 를 정리한다.

왜 Twilio 가 한국 070 을 못 주는가

한국 070 번호는 방통위(KCC) 별정통신사업자 등록 + KT·SKT·LG U+ 와의 상호접속 계약이 있어야 발급 가능하다. Twilio 는 한국 별정통신 등록이 없다. Vonage·Plivo·MessageBird·Telnyx 도 동일하다. Vapi·Retell 같은 음성 AI 플랫폼은 내부적으로 Twilio·Telnyx 위에 얹혀 있기 때문에 한국 번호 카탈로그가 비어 있다. 즉 "Twilio alternative for Korea" 를 찾는 건 다른 글로벌 CPaaS 를 갈아끼우는 게 아니라, 한국 별정통신사업자가 운영하는 SIP/REST 인프라를 직접 붙여야 한다는 뜻이다.

옵션 1 — Hybrid: Twilio 글로벌 + ClawOps 한국 070

기존 미국·유럽 번호는 Twilio 에 유지하고, 한국 번호만 ClawOps 에서 발급한다. 통화 도착 시 양쪽이 같은 라우터로 webhook 을 보내게 만들어 음성 AI agent 코드는 한 번만 작성한다.

# 라우터 한 개로 양쪽 받기
@app.post("/voice/inbound")
def inbound(req: Request):
    provider = "twilio" if "X-Twilio-Signature" in req.headers else "clawops"
    payload = normalize(req.json(), provider=provider)
    return route_to_agent(payload)

ClawOps 한국 070 발급:

curl -X POST https://api.claw-ops.com/v1/numbers \
  -H "Authorization: Bearer $CLAWOPS_KEY" \
  -d '{"country":"KR","prefix":"070","webhook":"https://you.com/voice/inbound"}'

응답에 phone_number, sip_uri, created_at 이 들어온다. 카드 등록·약정 없이 즉시 발급된다.

옵션 2 — 풀 마이그레이션: Twilio Voice → ClawOps

Twilio Voice API 호출 패턴을 ClawOps SDK 로 1:1 교체한다. 의미 매핑이 거의 직역이라 diff 가 짧다.

- from twilio.rest import Client
- client = Client(sid, token)
- client.calls.create(
-     to="+8210xxxxxxxx",
-     from_="+1xxxxxxxxxx",
-     url="https://you.com/twiml"
- )
+ from clawops import ClawOps
+ client = ClawOps(api_key=os.environ["CLAWOPS_KEY"])
+ client.calls.create(
+     to="+8210xxxxxxxx",
+     from_="+8270xxxxxxxx",
+     webhook="https://you.com/voice/inbound"
+ )

TwiML 흐름은 webhook + JSON action 으로 바뀐다. <Say>tts payload, <Gather>dtmf 이벤트, <Dial>transfer action. 한국어 TTS 는 ClawOps 내장 보이스가 기본이고, 외부 TTS (ElevenLabs·OpenAI) 는 audio_url 로 스트리밍한다.

def handle_event(event):
    if event["type"] == "call.started":
        return {"action": "tts", "text": "안녕하세요, 예약 도와드릴게요."}
    if event["type"] == "speech.final":
        reply = my_agent.respond(event["text"])
        return {"action": "tts", "text": reply}
    if event["type"] == "call.ended":
        save_transcript(event["transcript"], event["summary"])

OpenAI Realtime · Anthropic 모델은 ClawOps SIP 트렁크로 직결되어 양방향 오디오를 끌어 쓸 수 있다. media_url polling 없이 latency 가 한 hop 줄어든다.

5분 체크리스트

  1. ClawOps 가입 — 카드 없이 070 1개 발급 (POST /v1/numbers).
  2. Twilio inbound webhook URL 과 동일 경로를 ClawOps webhook 에 등록.
  3. normalize() 어댑터로 양쪽 payload 통일.
  4. 발급된 070-XXXX-XXXX 로 직접 전화 걸어서 agent 응답 확인.
  5. 통화 종료 후 webhook summary payload 가 DB 에 떨어지는지 확인.

기존 미국 트래픽은 Twilio 그대로, 한국 트래픽만 ClawOps. 코드 한 파일(라우터)만 건드린다.

SIP 직접 연결 — Asterisk·FreeSWITCH 운영 팀

SDK 없이 SIP 트렁크만 쓰고 싶다면 ClawOps 콘솔에서 SIP credential 을 발급받아 Asterisk pjsip.conf 또는 FreeSWITCH external profile 에 등록한다. INVITE 가 070 으로 들어오고, BYE 후 transcript webhook 이 별도로 도착한다. 자체 RTP 미디어 처리·자체 STT 파이프라인이 있는 팀에 맞는다.

자주 막히는 곳

  • From 번호 포맷: 한국 발신은 반드시 E.164 (+8270...). 국내 형식 (070-...) 으로 보내면 ClawOps API 가 400 으로 거절한다.
  • Webhook 서명 검증: ClawOps 는 X-Clawops-Signature HMAC-SHA256. Twilio 검증 로직과 분기 처리.
  • STT 언어 강제: 한국어 통화에 다국어 모델을 강제하면 정확도가 떨어진다. lang="ko" 명시.
  • DTMF vs Speech: 본인 인증·메뉴 분기는 DTMF 가 안전하다. 음성 인식 단독 의존 금지.

Twilio 코드 베이스를 버릴 필요 없다. 한국 번호와 한국어 음성 부분만 ClawOps 로 가져와라. 5분이면 070 이 받는다.

claw-ops.com

관련 글 더 보기

ClawOps AI 전화 API로 시작하기

070 번호 발급부터 AI 음성 통화까지, REST API 몇 줄이면 됩니다.