---
title: "นำหมายเลขของคุณเองมาใช้ (VoIP, API)"
description: "เชื่อมต่อ Twilio หรือ Telnyx — หรือ SIP trunk ใดก็ได้ — นำเข้าหมายเลขโทรศัพท์ที่คุณมีอยู่แล้ว และให้เอเจนต์ ThunderPhone รับสายและโทรออกผ่านหมายเลขเหล่านั้น"
---

หมายเลข ThunderPhone รองรับสายเรียกเข้า แต่สายเรียกออกและแคมเปญต้องใช้หมายเลขที่คุณเป็นเจ้าของผ่านผู้ให้บริการ VoIP ของคุณเอง คู่มือนี้จะแนะนำขั้นตอน 3 ขั้นตอน: **ทดสอบข้อมูลรับรอง → สร้างการเชื่อมต่อ → นำเข้าหมายเลข → ยืนยัน**

<Note>
  แดชบอร์ดมีเวอร์ชันพร้อมคำแนะนำของขั้นตอนทั้งหมดนี้ใน
  **การเชื่อมต่อ → VoIP** (`/dashboard/voip-connections`): การตั้งค่า Telnyx
  แบบมีคำแนะนำที่ครอบคลุมการสร้างบัญชีและคีย์ API เส้นทางเชื่อมต่อบัญชีที่มีอยู่
  และแบบฟอร์ม SIP แบบกำหนดเองพร้อมตัวสร้างคู่มือการตั้งค่าด้วย AI
</Note>

## ผู้ให้บริการที่รองรับ

| ผู้ให้บริการ | รหัส `provider` | หมายเหตุ |
|----------|---------------|-------|
| Twilio | `twilio` | Account SID + Auth Token; หนึ่งการเชื่อมต่อสำหรับแต่ละบัญชีหรือบัญชีย่อยของ Twilio (ดู [บัญชีย่อยของ Twilio](#twilio-subaccounts)) |
| Telnyx | `telnyx` | คีย์ API; มีการเริ่มต้นใช้งานแบบมีคำแนะนำ (`setup_method: guided_telnyx`) |
| SignalWire | `signalwire` | **เร็ว ๆ นี้** — เชื่อมต่อผ่าน Manual SIP ได้ในวันนี้ |
| Vonage | `vonage` | **เร็ว ๆ นี้** — เชื่อมต่อผ่าน Manual SIP ได้ในวันนี้ |
| Manual SIP | `manual` | SIP trunk ใดก็ได้ — ใช้การกำหนดค่าของคุณเอง |

## 1. ทดสอบข้อมูลรับรอง

ก่อนสร้างการเชื่อมต่อ VoIP แบบถาวร ให้ตรวจสอบข้อมูลรับรองของผู้ให้บริการ
เพื่อยืนยันว่าใช้งานได้ การดำเนินการนี้จะส่งคืน
`verification_evidence_id` ซึ่งคุณส่งต่อไปยังขั้นตอนการสร้าง เพื่อไม่ให้
ข้อมูลรับรองถูกเรียกเก็บเงินซ้ำจากการทดสอบ

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections/test \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider":    "telnyx",
    "credentials": { "apiKey": "KEY...", "connectionId": "123456" },
    "sip_config":  { "domain": "acme.sip.telnyx.com" }
  }'
```

```json Response
{
  "status": "pass",
  "verification_evidence_id": "b9a2...",
  "suggested_connection_name": "Telnyx: Acme Main (+15550001234)",
  "checks": {
    "credentials_valid": true,
    "inbound_reachable": true,
    "outbound_authorized": true
  }
}
```

หากการตรวจสอบใดล้มเหลว `status` ของการตอบกลับจะเป็น `fail` และ `checks` จะ
แสดงขั้นตอนที่เกิดข้อผิดพลาด แก้ไขการกำหนดค่าฝั่งผู้ให้บริการ (การกำหนด trunk
รายการอนุญาต IP การอนุญาตสายเรียกออก) แล้วลองอีกครั้ง

## 2. สร้างการเชื่อมต่อ

ส่ง `verification_evidence_id` ที่เพิ่งได้รับ:

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name":         "Acme Telnyx Main",
    "provider":     "telnyx",
    "setup_method": "api_key",
    "credentials":  { "apiKey": "KEY...", "connectionId": "123456" },
    "sip_config":   { "domain": "acme.sip.telnyx.com" },
    "verification_evidence_id": "b9a2..."
  }'
```

การตอบกลับคือ [อ็อบเจ็กต์ VoipConnection](/api-reference/voip-connections#connection-object)
ที่มี `status="connected"` ข้อมูลรับรองจะถูกจัดเก็บฝั่งเซิร์ฟเวอร์และจะไม่ถูก
ส่งกลับเป็นข้อความธรรมดาในการเรียก GET ครั้งถัดไป — หากต้องการหมุนเวียนข้อมูลรับรอง ให้รัน
`test` ใหม่และ PATCH ด้วยหลักฐานใหม่

### บัญชีย่อย Twilio

การเชื่อมต่อ Twilio จะผูกกับบัญชี Twilio เดียวที่มี
Account SID และ Auth Token อยู่ Twilio จะเก็บหมายเลขโทรศัพท์และ SIP
trunk ไว้ภายในบัญชีย่อยแต่ละบัญชี ดังนั้นการเชื่อมต่อที่สร้างด้วยบัญชีหลัก
จะเห็นเฉพาะหมายเลขของบัญชีหลักเท่านั้น และไม่สามารถเปลี่ยนการเชื่อมต่อที่มีอยู่
ไปยังบัญชีย่อยอื่นในภายหลังได้ (ระบบจะปฏิเสธการอัปเดตเนื่องจาก SIP trunk
ของการเชื่อมต่ออยู่ในบัญชีเดิม)

หากต้องการเข้าถึงหมายเลขที่อยู่ในบัญชีย่อย ให้สร้างการเชื่อมต่อหนึ่งรายการต่อ
บัญชีย่อย แดชบอร์ดดำเนินการนี้ให้คุณ: เมื่อคุณเชื่อมต่อบัญชีหลัก
ที่มีบัญชีย่อยที่ใช้งานอยู่ กล่องโต้ตอบการตั้งค่าจะแสดงรายการบัญชีย่อย คุณ
เลือกบัญชีที่ต้องการ แล้ว ThunderPhone จะสร้างการเชื่อมต่อ (และ
SIP trunk) ในแต่ละบัญชี ขั้นตอนเดียวกันนี้ใช้งานผ่าน API ได้:

```bash
# Discover active subaccounts visible to the parent credentials
curl -X POST https://api.thunderphone.com/v1/voip-connections/twilio/subaccounts \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"credentials": {"accountSid": "ACparent...", "authToken": "..."}}'
```

```json Response
{
  "discovery_id": "7c1e...",
  "parent": { "sid": "ACparent...", "friendly_name": "Acme" },
  "subaccounts": [
    { "sid": "ACsupport...", "friendly_name": "Acme Support", "already_connected": false, "connection_id": null },
    { "sid": "ACsales...",   "friendly_name": "Acme Sales",   "already_connected": true,  "connection_id": 5 }
  ]
}
```

```bash
# Create a connection for each selected subaccount
curl -X POST https://api.thunderphone.com/v1/voip-connections/twilio/subaccounts/connect \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"discovery_id": "7c1e...", "subaccount_sids": ["ACsupport..."]}'
```

การตอบกลับมีหนึ่งแถวต่อบัญชีย่อย โดยมี `status` เป็น
`created`, `skipped` (เชื่อมต่อแล้ว) หรือ `failed` พร้อม `error`
ที่คุณสามารถดำเนินการแก้ไขได้ แต่ละแถวเป็นอิสระต่อกัน ดังนั้นความล้มเหลวในบัญชีย่อยหนึ่ง
จะไม่ขัดขวางบัญชีอื่น และ `discovery_id` จะยังใช้ได้เป็นเวลา 30
นาที จึงสามารถลองแถวที่ล้มเหลวอีกครั้งได้ บันทึกโทเค็นของบัญชีย่อยจะถูก
อ่านจาก Twilio ในเวลาค้นหาและจัดเก็บไว้ในการเชื่อมต่อใหม่
โดย API จะไม่ส่งโทเค็นเหล่านี้กลับมา การเชื่อมต่อใหม่แต่ละรายการจะนำเข้า
และยืนยันหมายเลขในลักษณะเดียวกับการเชื่อมต่อที่คุณสร้างด้วยตนเองทุกประการ

## 3. แสดงรายการและนำเข้าหมายเลข

ตรวจสอบหมายเลขที่ข้อมูลรับรองของคุณมองเห็นและยังไม่ได้อยู่
ในองค์กร ThunderPhone:

```bash
curl https://api.thunderphone.com/v1/voip-connections/5/available-numbers \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```

จากนั้นนำเข้าหมายเลขที่ต้องการ:

```bash
curl -X POST https://api.thunderphone.com/v1/voip-connections/5/import-numbers \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": ["+15550001234", "+15550009999"]}'
```

การนำเข้าแต่ละครั้งจะกลายเป็น[ทรัพยากรหมายเลขโทรศัพท์](/api-reference/phone-numbers)
ในองค์กรของคุณ โดยมี `source="voip"` และ `status="provisioning"`

## 4. ยืนยันหมายเลขที่นำเข้าแต่ละหมายเลข

การนำเข้าจะลงทะเบียนหมายเลขให้เป็น *พร้อมใช้งาน* แต่การกำหนดเส้นทางสาย
ผ่านหมายเลขนั้นจริงต้องมีการยืนยัน สำหรับการเชื่อมต่อผู้ให้บริการ (Twilio
และ Telnyx) ระบบจะตรวจสอบข้อมูลรับรองผู้ให้บริการและการเข้าถึง SIP อีกครั้ง
สำหรับการเชื่อมต่อ **SIP แบบกำหนดเอง** ระบบจะโทรทดสอบสั้น ๆ (ไม่กี่
วินาที และวางสายโดยอัตโนมัติ) *จาก* หมายเลขนั้น *ผ่าน* SIP trunk ของคุณ
*ไปยัง* หมายเลข ThunderPhone เพื่อพิสูจน์ว่าได้ตั้งค่าชื่อผู้ใช้ รหัสผ่าน
การขนส่ง และการกำหนดเส้นทางขาออกของ trunk ใช้งานได้จริง ผู้ให้บริการเครือข่าย
ของคุณจะคิดค่าบริการสายนี้เช่นเดียวกับสายอื่น

```bash
curl -X POST https://api.thunderphone.com/v1/phone-numbers/{id}/verify-voip \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```

เมื่อสำเร็จ `voip_verification_status` จะเปลี่ยนเป็น `verified` และหมายเลข
จะเข้าสู่ `status="active"` หากไม่สำเร็จ การตอบกลับจะระบุอย่างชัดเจนว่า
สิ่งใดล้มเหลว สำหรับ trunk แบบกำหนดเอง จะเป็นคำตอบ SIP ของผู้ให้บริการ
เครือข่าย ตัวอย่างเช่น *"ปฏิเสธข้อมูลรับรองของ ThunderPhone (SIP 401)"*
หรือ *"ไม่สามารถกำหนดเส้นทางสายได้ (SIP 404)"* ให้แก้ไขปัญหา
(ข้อมูลรับรอง IP ต้นทางที่อนุญาต หรือการกำหนด trunk ที่ขาดหายไปในแดชบอร์ด
ของผู้ให้บริการ) แล้วเรียกใช้อีกครั้ง

## 5. กำหนดเอเจนต์และรับสาย

เมื่อยืนยันหมายเลขแล้ว คุณสามารถกำหนดเอเจนต์ขาเข้า / ขาออกได้เช่นเดียวกับ
หมายเลข ThunderPhone ดู
[จัดการสายขาเข้า](/th/guides/handle-inbound-calls) และ
[โทรออก](/th/guides/place-outbound-calls)

## การหมุนเวียนข้อมูลรับรอง

เมื่อมีการหมุนเวียนคีย์ของผู้ให้บริการ ให้เรียกใช้ขั้นตอนทดสอบแล้วอัปเดตอีกครั้ง:

```bash
# 1. Test the new credentials
curl -X POST https://api.thunderphone.com/v1/voip-connections/test ...

# 2. PATCH the connection with the new evidence
curl -X PATCH https://api.thunderphone.com/v1/voip-connections/{id} \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "credentials": { "apiKey": "NEW_KEY..." },
    "verification_evidence_id": "fresh-evidence-id"
  }'
```

การเชื่อมต่อจะยังคงอยู่ ไม่จำเป็นต้องนำเข้าหมายเลขใหม่

---

## ขั้นตอนถัดไป

<CardGroup cols={2}>
  <Card title="ข้อมูลอ้างอิงการเชื่อมต่อ VoIP" icon="phone-volume" href="/api-reference/voip-connections">
    ทุกฟิลด์ในการตอบกลับของการเชื่อมต่อ หลักฐาน และการนำเข้า
  </Card>
  <Card title="ข้อมูลอ้างอิงหมายเลขโทรศัพท์" icon="phone" href="/api-reference/phone-numbers">
    กำหนดเอเจนต์ โอนระหว่างองค์กร ปล่อยหมายเลข
  </Card>
  <Card title="โทรออก" icon="arrow-up-right" href="/th/guides/place-outbound-calls">
    เมื่อคุณเป็นเจ้าของหมายเลขแล้ว ให้เริ่มโทรออก
  </Card>
</CardGroup>
