# 📘 เอกสารคู่มือการเชื่อมต่อระบบ LnwthaiLive / ThaiGoLive API
**Official System Integration & Developer Reference Manual (Enterprise Edition v1.5.0)**
*คู่มือฉบับเต็มสมบูรณ์ (Unabridged Production Reference) พร้อมตัวอย่างการเชื่อมต่อจริงด้วย Enterprise API Key*

---

## 📑 สารบัญ (Table of Contents)
1. [ภาพรวมระบบและสถาปัตยกรรม (System Architecture & Overview)](#1-ภาพรวมระบบและสถาปัตยกรรม)
2. [การยืนยันตัวตนและการใส่ API Key (Authentication & API Key)](#2-การยืนยันตัวตนและการใส่-api-key)
3. [ระดับแพ็กเกจและข้อจำกัดการเรียกใช้งาน (Tiers & Rate Limits)](#3-ระดับแพ็กเกจและข้อจำกัดการเรียกใช้งาน)
4. [ระบบ AskMeBet (AMB) Live Football & Embed Player (หัวข้อพิเศษ)](#4-ระบบ-askmebet-amb-live-football--embed-player)
   - [4.1 ดึงตารางบอลสดและบอลวันนี้ (`/api/askmebet/live`)](#41-ดึงตารางบอลสดและบอลวันนี้)
   - [4.2 ดึงลิงก์ Embed / iFrame เครื่องเล่นวิดีโอ (`/api/askmebet/embed`)](#42-ดึงลิงก์-embed--iframe-เครื่องเล่นวิดีโอ)
   - [4.3 ตัวอย่างการฝัง iFrame Player บนหน้าเว็บจริง](#43-ตัวอย่างการฝัง-iframe-player-บนหน้าเว็บจริง)
5. [หมวดกีฬาสากลอื่นๆ ครบ 17+ ชนิดกีฬา (Multi-Sports API) ⭐](#5-หมวดกีฬาสากลอื่นๆ-ครบ-17-ชนิดกีฬา-multi-sports-api)
   - [5.1 รายการกีฬาที่รองรับทั้งหมด (Supported Sports Matrix)](#51-รายการกีฬาที่รองรับทั้งหมด-supported-sports-matrix)
   - [5.2 ดึงข้อมูลกีฬาสากลแยกตามประเภท (`/api/ge-sports`)](#52-ดึงข้อมูลกีฬาสากลแยกตามประเภท-apige-sports)
   - [5.3 ดึงข้อมูลกีฬาผ่าน Matches API (`/api/public/matches?sport=...`)](#53-ดึงข้อมูลกีฬาผ่าน-matches-api-apipublicmatchessport)
6. [รายละเอียด API Endpoints กีฬาพื้นบ้านและฟุตบอลสด (Specialized Sports Endpoints)](#6-รายละเอียด-api-endpoints-กีฬาพื้นบ้านและฟุตบอลสด)
   - [6.1 หมวดฟุตบอลสดและผลการแข่งขัน (`/api/public/matches`)](#61-หมวดฟุตบอลสดและผลการแข่งขัน)
   - [6.2 หมวดเหตุการณ์สดในเกม (`/api/public/matches/live-incidents`)](#62-หมวดเหตุการณ์สดในเกม)
   - [6.3 หมวดตารางคะแนนและสถิติ (`/api/public/standings`)](#63-หมวดตารางคะแนนและสถิติ)
   - [6.4 หมวดมวยไทยสนามหลัก (`/api/public/boxing`)](#64-หมวดมวยไทยสนามหลัก)
   - [6.5 หมวดมวยพักยก & ราคาต่อรองสด (`/api/public/muay-pakyok`)](#65-หมวดมวยพักยก--ราคาต่อรองสด)
   - [6.6 หมวดวัวชนและไก่ชนถ่ายทอดสด (`/api/public/wuachon`)](#66-หมวดวัวชนและไก่ชนถ่ายทอดสด)
   - [6.7 หมวดทีวีดิจิตอลและ IPTV (`/api/iptv/channels`)](#67-หมวดทีวีดิจิตอลและ-iptv)
   - [6.8 หมวดบทวิเคราะห์บอล VIP 14 จุด (`/api/analyse/today`)](#68-หมวดบทวิเคราะห์บอล-vip-14-จุด)
7. [คู่มือการเชื่อมต่อระบบถ่ายทอดสด HLS (Live Streaming Integration)](#7-คู่มือการเชื่อมต่อระบบถ่ายทอดสด-hls)
8. [ตัวอย่างโค้ดเชื่อมต่อระบบจริง (Production Code Examples)](#8-ตัวอย่างโค้ดเชื่อมต่อระบบจริง)
   - [8.1 Node.js / TypeScript (ครบทั้ง AMB, Multi-Sports, และ Football)](#81-nodejs--typescript)
   - [8.2 PHP (cURL & OOP Multi-Sports SDK)](#82-php-curl--oop-multi-sports-sdk)
   - [8.3 Python (Requests SDK)](#83-python-requests-sdk)
   - [8.4 Frontend React / Vue / Vanilla JS Embed Component](#84-frontend-react--vue--vanilla-js-embed-component)
   - [8.5 HTML5 + Hls.js Video Player](#85-html5--hlsjs-video-player)
   - [8.6 WordPress Integration (การเชื่อมต่อสำหรับ WordPress ผ่าน Transients Caching, Shortcodes, และ Elementor)](#86-wordpress-integration)
9. [การจัดการข้อผิดพลาดและรหัสสถานะ (Error Handling & HTTP Status Codes)](#9-การจัดการข้อผิดพลาดและรหัสสถานะ)
10. [ข้อควรระวังสำคัญและแนวทางปฏิบัติ (Gotchas & Best Practices)](#10-ข้อควรระวังสำคัญและแนวทางปฏิบัติ)

---

## 1. ภาพรวมระบบและสถาปัตยกรรม

ระบบ **LnwthaiLive / ThaiGoLive API Infrastructure** ให้บริการข้อมูลการแข่งขันกีฬาและสตรีมมิ่งความเร็วสูงระดับ Enterprise โดยครอบคลุมทั้ง:

1. **ฟุตบอลและกีฬาสากลระดับโลก (17+ ชนิดกีฬา):** บาสเกตบอล (NBA), เทนนิส (ATP/WTA), วอลเลย์บอล (VNL), แบดมินตัน (BWF), เบสบอล (MLB), มวยสากล/UFC/MMA, โมโตจีพี (MotoGP), กอล์ฟ (PGA), รักบี้, ฮอกกี้น้ำแข็ง และอื่นๆ
2. **ระบบ AskMeBet (AMB) Live & Embed:** ตารางบอลสดระดับโลก พร้อมโค้ด Embed iFrame เครื่องเล่นวิดีโอในตัว ล็อก IP ป้องกันแฮก
3. **กีฬาพื้นบ้านยอดนิยมของไทย:** มวยไทย 7 สี/ราชดำเนิน/ลุมพินี, มวยพักยกไหลสด OneBX, วัวชนภาคใต้ และไก่ชนเดิมพันสูง
4. **ทีวีดิจิตอล & IPTV Live Streaming (HLS):** สตรีม m3u8 ความคมชัด Full HD 1080p พร้อมระบบ Secure Token

```
+-----------------------------------------------------------------------------------+
|                                 LnwthaiLive API                                   |
|                      Base URL: https://lnwthailive.online                         |
+-----------------------------------------+-----------------------------------------+
                                          |
        +---------------------------------+---------------------------------+
        |                                                                   |
        v                                                                   v
+-----------------------+                                         +-----------------------+
|  Multi-Sports & Data  |                                         | Stream & Player Engine|
| - 17+ Sports (NBA/WTA)|                                         | - AMB Embed iFrame    |
| - Live Scores & Stats |                                         | - HLS Proxy (m3u8)    |
| - Muay Pakyok & Odds  |                                         | - IPTV Channels (stk) |
| - Wuachon / Cockfight |                                         | - Multi-Bitrate Chunks|
+-----------+-----------+                                         +-----------+-----------+
            |                                                                 |
            v                                                                 v
+-----------------------+                                         +-----------------------+
|  Your Backend Server  | ────( ส่ง JSON / Embed URL ให้ Client )─▶ | Client Web / App      |
| (Node.js/PHP/Python)  |                                         | (iFrame / Hls.js)     |
+-----------------------+                                         +-----------------------+
```

---

## 2. การยืนยันตัวตนและการใส่ API Key

ทุกการเรียกใช้งาน API ต้องมี **API Key** ที่ถูกต้องกำกับอยู่เสมอ:

### 2.1 ส่งผ่าน HTTP Header (⭐ แนะนำสูงสุดสำหรับ Backend Server)
```http
GET /api/ge-sports?type=Basketball HTTP/1.1
Host: lnwthailive.online
x-api-key: tgl-enterprise-8655529a5afc52d0
Accept: application/json
```

### 2.2 ส่งผ่าน Query Parameter (สำหรับทดสอบหรือเปิดบน Player)
```http
https://lnwthailive.online/api/ge-sports?type=Basketball&api_key=tgl-enterprise-8655529a5afc52d0
```

---

## 3. ระดับแพ็กเกจและข้อจำกัดการเรียกใช้งาน

| แพ็กเกจ (Tier) | อัตราการเรียก (Rate Limit) | ขอบเขตการเข้าถึงข้อมูล (Permissions) | การใช้งานที่เหมาะสม |
|---|---|---|---|
| **Starter** | 60 req / min | ผลบอลสด, ตารางคะแนน, ผลย้อนหลัง | เว็บไซต์ขนาดเล็ก-บล็อกกีฬา |
| **Pro** | 180 req / min | ฟุตบอลสด, เหตุการณ์สด, มวยไทย, สถิติวิเคราะห์ | เว็บไซต์ผลบอลและข่าวสารขนาดกลาง |
| **Enterprise** | **Unlimited (ไม่จำกัด)** | **ครบทุกบริการ 100% + AMB Embed + ครบ 17+ กีฬาสากล + วัวชน/ไก่ชน + HLS Dedicated** | **เว็บสายกีฬาขนาดใหญ่, ค่ายคาสิโน, Mobile Apps** |
| **IPTV Only** | 300 req / min | ผังช่องทีวีดิจิตอล + ช่องกีฬาสตรีม HLS | ระบบ Smart TV / กล่อง Android |

---

## 4. ระบบ AskMeBet (AMB) Live Football & Embed Player

ระบบ AskMeBet (AMB) ให้บริการข้อมูลตารางบอลสดระดับโลกพร้อมระบบ **Embed iFrame Video Player** สำเร็จรูป สามารถนำโค้ด iFrame ไปแปะบนหน้าเว็บให้ผู้ใช้งานคลิกดูบอลสดได้ทันทีโดยไม่ต้องเขียน Player เอง

---

### 4.1 ดึงตารางบอลสดและบอลวันนี้

* **Endpoint:** `GET /api/askmebet/live`
* **Headers:** `x-api-key: tgl-enterprise-8655529a5afc52d0`
* **ตัวอย่างคำขอ (cURL):**
```bash
curl -X GET "https://lnwthailive.online/api/askmebet/live" \
     -H "x-api-key: tgl-enterprise-8655529a5afc52d0"
```

* **ตัวอย่างผลลัพธ์จริง (200 OK):**
```json
{
  "ok": true,
  "service": "AskMeBet Football Live API v2",
  "client_ip": "49.237.108.102",
  "live_count": 27,
  "today_count": 170,
  "live_now": [
    {
      "match_id": "72151048",
      "league": {
        "name_en": "Japan J2 League",
        "name_th": "ญี่ปุ่น เจ ลีก 2",
        "flag_logo": "https://data.askmescore.live/static/images/tournaments/402"
      },
      "start_time": "2026-08-16T10:00:00.000Z",
      "status_time": "2H 26",
      "home_team": {
        "name_en": "Tokushima Vortis",
        "name_th": "โตกุชิม่า โวร์ติส",
        "logo": "https://data.askmescore.live/static/images/teams/21907?size=large"
      },
      "away_team": {
        "name_en": "Sagan Tosu",
        "name_th": "สากัน โตสู",
        "logo": "https://data.askmescore.live/static/images/teams/21908?size=large"
      },
      "score": "1 - 0",
      "red_card": { "home": 0, "away": 0 },
      "yellow_card": { "home": 1, "away": 2 },
      "embed_api_url": "/api/askmebet/embed?matchId=72151048"
    }
  ]
}
```

---

### 4.2 ดึงลิงก์ Embed / iFrame เครื่องเล่นวิดีโอ

* **Endpoint:** `GET /api/askmebet/embed?matchId=72151048`
* **Headers:** `x-api-key: tgl-enterprise-8655529a5afc52d0`

* **ตัวอย่างผลลัพธ์จริง (200 OK):**
```json
{
  "ok": true,
  "matchId": "72151048",
  "client_ip": "49.237.108.102",
  "embed_url": "https://www.638662097312.com/livetv/1/amb/amb/20348091/913b8f0c-6a51-456c-acb5-f8ef3e493e9b/e053f23c1a9fc3dd9214470f31ae16e6/af1ffb8f64e487c96cd6d987caa5565c/165.154.247.207/1786880032?=&fs=1&lang=th",
  "iframe_snippet": "<iframe src=\"https://www.638662097312.com/livetv/1/amb/amb/20348091/.../1786880032?=&fs=1&lang=th\" width=\"100%\" height=\"100%\" frameborder=\"0\" allowfullscreen></iframe>"
}
```

---

### 4.3 ตัวอย่างการฝัง iFrame Player บนหน้าเว็บจริง

```html
<!-- กล่องเครื่องเล่นบอลสด AskMeBet สำเร็จรูป -->
<div style="position: relative; width: 100%; max-width: 900px; height: 500px; border-radius: 12px; overflow: hidden; background: #000;">
  <iframe 
    src="https://www.638662097312.com/livetv/1/amb/amb/20348091/913b8f0c-6a51-456c-acb5-f8ef3e493e9b/.../1786880032?=&fs=1&lang=th" 
    width="100%" 
    height="100%" 
    frameborder="0" 
    allow="autoplay; fullscreen; encrypted-media" 
    allowfullscreen>
  </iframe>
</div>
```

---

## 5. หมวดกีฬาสากลอื่นๆ ครบ 17+ ชนิดกีฬา (Multi-Sports API) ⭐

ระบบรองรับการดึงข้อมูลกีฬาสากลยอดนิยมระดับโลกมากกว่า 17 ชนิดกีฬา พร้อมผลสด สกอร์ นาทีแข่งขัน รายชื่อทีม โลโก้ และลิงก์ดูสด

---

### 5.1 รายการกีฬาที่รองรับทั้งหมด (Supported Sports Matrix)

| รหัสประเภท (`type=`) | ชนิดกีฬา (ภาษาไทย) | รายการแข่งขันหลักที่ครอบคลุม | ผลการทดสอบสด |
|---|---|---|:---:|
| `Basketball` | 🏀 **บาสเกตบอล** | NBA, WNBA, EuroLeague, FIBA, CBA | ✅ พบ 26 แมตช์ |
| `Volleyball` | 🏐 **วอลเลย์บอล** | VNL, U17/U20 World Championship, ลีกตุรกี/อิตาลี | ✅ พบ 8 แมตช์ |
| `Tennis` | 🎾 **เทนนิส** | Wimbledon, US Open, French Open, ATP 1000, WTA Cincinnati | ✅ พบ 25 แมตช์ |
| `Badminton` | 🏸 **แบดมินตัน** | BWF World Tour, All England, Thomas & Uber Cup | ✅ มีข้อมูลสด |
| `Baseball` | ⚾ **เบสบอล** | MLB (อเมริกา), NPB (ญี่ปุ่น), KBO (เกาหลี) | ✅ พบ 23 แมตช์ |
| `Fighting` | 🥊 **MMA / UFC / ศิลปะการต่อสู้** | UFC Main Card, ONE Championship, Bellator, Boxing | ✅ พบ 3 แมตช์ |
| `Cycling` | 🚴 **จักรยานทางไกล** | Tour de France, Giro d'Italia, UCI Pro Series | ✅ พบ 6 แมตช์ |
| `AustralianFootball` | 🏉 **ออสเตรเลียนฟุตบอล** | AFL Premiership (Australia) | ✅ พบ 5 แมตช์ |
| `Rugby` | 🏉 **รักบี้** | NRL, Six Nations, Super Rugby, Rugby Championship | ✅ พบ 9 แมตช์ |
| `Futsal` | ⚽ **ฟุตซอล & ฟุตบอลสากล** | Futsal World Cup, MLS, South American Leagues | ✅ พบ 156 แมตช์ |
| `MotoGP` / `motor` | 🏎️ **มอเตอร์สปอร์ต / F1** | MotoGP, Formula 1, World Superbike | ✅ รองรับ |
| `Golf` | ⛳ **กอล์ฟ** | PGA Tour, DP World Tour, LIV Golf, The Masters | ✅ รองรับ |
| `IceHockey` | 🏒 **ฮอกกี้น้ำแข็ง** | NHL, KHL, World Championship | ✅ รองรับ |
| `Cricket` | 🏏 **คริกเก็ต** | ICC World Cup, IPL, The Ashes, T20 | ✅ รองรับ |
| `Darts` | 🎯 **ปาเป้า** | PDC World Darts Championship, Premier League Darts | ✅ รองรับ |
| `Athletics` | 🏃 **กรีฑา** | Olympic Games, World Athletics Diamond League | ✅ รองรับ |
| `Netball` | 🏐 **เนตบอล** | Suncorp Super Netball, Netball Quad Series | ✅ รองรับ |

---

### 5.2 ดึงข้อมูลกีฬาสากลแยกตามประเภท (`GET /api/ge-sports`)

* **Endpoint:** `GET /api/ge-sports`
* **Headers:** `x-api-key: tgl-enterprise-8655529a5afc52d0`
* **Query Parameters:**
  * `type` *(String, Required)*: ระบุชื่อกีฬา เช่น `Basketball`, `Volleyball`, `Tennis`, `Badminton`, `Baseball`, `Fighting`, `Cycling`, `Rugby`, `Futsal`, `MotoGP`
  * `api_key` *(String, Optional)*: ส่ง API Key ผ่าน Query Param

* **ตัวอย่างคำขอดึง บาสเกตบอล (cURL):**
```bash
curl -X GET "https://lnwthailive.online/api/ge-sports?type=Basketball" \
     -H "x-api-key: tgl-enterprise-8655529a5afc52d0"
```

* **ตัวอย่างผลลัพธ์จริง (200 OK):**
```json
{
  "success": true,
  "count": 26,
  "matches": [
    {
      "id": "rb_2207714",
      "time": "07:00",
      "league": "Women's National Basketball Association",
      "teamHome": "ลาสเวกัส เอซ",
      "teamAway": "มินเนโซต้า ลินซ์",
      "homeLogo": "/api/imgproxy?url=...",
      "awayLogo": "/api/imgproxy?url=...",
      "leagueLogo": "/api/imgproxy?url=...",
      "isLive": false,
      "score": "98 - 95",
      "streamUrl": "/api/streams/rb_2207714",
      "playerUrl": "/player/rb_2207714",
      "channels": [
        { "id": "main", "name": "รับชมสด (HD)" }
      ],
      "matchStatus": "จบเกม",
      "sport": "basketball",
      "day": "today"
    }
  ]
}
```

* **ตัวอย่างคำขอดึง เทนนิส (`type=Tennis`):**
```bash
curl -X GET "https://lnwthailive.online/api/ge-sports?type=Tennis" \
     -H "x-api-key: tgl-enterprise-8655529a5afc52d0"
```

* **ตัวอย่างคำขอดึง วอลเลย์บอล (`type=Volleyball`):**
```bash
curl -X GET "https://lnwthailive.online/api/ge-sports?type=Volleyball" \
     -H "x-api-key: tgl-enterprise-8655529a5afc52d0"
```

* **ตารางอธิบายฟิลด์ข้อมูล (`/api/ge-sports`):**
  | ฟิลด์ | ชนิดข้อมูล | คำอธิบาย |
  |---|---|---|
  | `success` | Boolean | สถานะคำขอสำเร็จ (`true` / `false`) |
  | `count` | Integer | จำนวนคู่แข่งขันที่พบในหมวดกีฬานี้ |
  | `id` | String | รหัส ID ประจำแมตช์ (เช่น `rb_2207714`) สำหรับดึงสตรีม |
  | `league` | String | ชื่อลีกหรือรายการแข่งขัน (เช่น `NBA`, `WTA Cincinnati`) |
  | `teamHome` / `teamAway` | String | ชื่อทีมเหย้า / เยือน (หรือชื่อนักกีฬา 1 vs นักกีฬา 2 ในกีฬาเดี่ยว) |
  | `score` | String | สกอร์ปัจจุบัน เช่น `98 - 95` หรือ `vs` (กรณีแมตช์ยังไม่เริ่ม) |
  | `matchStatus` | String | สถานะการแข่งขัน: `กำลังแข่ง`, `จบเกม`, `ยังไม่แข่ง`, `Q1`, `Q2`, `Q3`, `Q4`, `Set 1`, `Set 2` |
  | `isLive` | Boolean | `true` หากกำลังทำการแข่งขันสดอยู่ในขณะนี้ |
  | `streamUrl` | String | URL สตรีมมิ่งสำหรับนำไปเปิดเล่น |

---

### 5.3 ดึงข้อมูลกีฬาผ่าน Matches API (`/api/public/matches?sport=...`)

นอกจากการดึงผ่าน `/api/ge-sports` แล้ว คุณยังสามารถดึงข้อมูลกีฬาผ่าน Endpoint หลัก `/api/public/matches` ได้โดยระบุพารามิเตอร์ `sport`:

| URL ตัวอย่าง | คำอธิบาย |
|---|---|
| `/api/public/matches?sport=football` | ดึงฟุตบอลสดวันนี้ (48+ คู่) |
| `/api/public/matches?sport=basketball` | ดึงบาสเกตบอลสด (26+ คู่) |
| `/api/public/matches?sport=volleyball` | ดึงวอลเลย์บอลสด (8+ คู่) |
| `/api/public/matches?sport=tennis` | ดึงเทนนิสสด (25+ คู่) |
| `/api/public/matches?sport=badminton` | ดึงแบดมินตันสด |
| `/api/public/matches?sport=baseball` | ดึงเบสบอลสด (23+ คู่) |

---

## 6. รายละเอียด API Endpoints กีฬาพื้นบ้านและฟุตบอลสด

---

### 6.1 หมวดฟุตบอลสดและผลการแข่งขัน (`GET /api/public/matches`)
* **Headers:** `x-api-key: tgl-enterprise-8655529a5afc52d0`
* **ตัวอย่าง Response:**
```json
{
  "ok": true,
  "tier": "enterprise",
  "count": 48,
  "data": [
    {
      "id": "6a80040540a6407628370384",
      "time": "61'",
      "league": "Portugal - เซกุนดา ลีกา",
      "teamHome": "พอร์ติโมเนนเซ่",
      "teamAway": "วีเซลา",
      "isLive": true,
      "score": "1 - 0",
      "streamUrl": "/api/streams/6a80040540a6407628370384",
      "matchStatus": "กำลังแข่ง",
      "sport": "football"
    }
  ]
}
```

---

### 6.2 หมวดเหตุการณ์สดในเกม (`GET /api/public/matches/live-incidents`)
* **Query Parameters:** `ids=104859,104860` *(Required)*
* **ตัวอย่าง Response:**
```json
{
  "success": true,
  "incidents": {
    "104859": [
      {
        "id": 294819,
        "type": "goal",
        "time": "34",
        "team": "home",
        "player": "Marcus Rashford",
        "assist": "Bruno Fernandes",
        "score": "1-0"
      }
    ]
  }
}
```

---

### 6.3 หมวดตารางคะแนนและสถิติ (`GET /api/public/standings`)
* **ตัวอย่าง Response:**
```json
{
  "ok": true,
  "tier": "enterprise",
  "count": 9,
  "data": [
    {
      "leagueName": "Premier League",
      "rows": [
        {
          "position": 1,
          "team": "Manchester City",
          "played": 38,
          "points": 91,
          "won": 28,
          "draw": 7,
          "lost": 3
        }
      ]
    }
  ]
}
```

---

### 6.4 หมวดมวยไทยสนามหลัก (`GET /api/public/boxing`)
* **ตัวอย่าง Response (29 รายการ):**
```json
{
  "ok": true,
  "tier": "enterprise",
  "count": 29,
  "data": {
    "programs": [
      {
        "id": "17343",
        "name": "ศึกมวยไทย 7 สี",
        "stadium": "สนามมวยช่อง 7 สี",
        "dateTime": "2026-08-16T14:30:00+07:00",
        "events": [
          {
            "roundName": "คู่เอก",
            "redCorner": "เพชรบ้านไร่ สิงห์มาวิน",
            "blueCorner": "สารวัตรใหญ่ ส.เดชะพันธ์",
            "status": "live"
          }
        ]
      }
    ]
  }
}
```

---

### 6.5 หมวดมวยพักยก & ราคาต่อรองสด (`GET /api/public/muay-pakyok`)
* **ตัวอย่าง Response:**
```json
{
  "ok": true,
  "total": 4,
  "live": 1,
  "tier": "enterprise",
  "data": [
    {
      "id": 69254,
      "league": "มวยไทย - ศึกท่อน้ำไทยเกียรติเพชร ที.เค.โอ.(ช่อง ททบ.5)",
      "status": "live",
      "redCorner": { "name": "เพชรดำ เกียรติเพชร" },
      "blueCorner": { "name": "ยอดขุนศึก ศิษย์ครูเยี่ยม" },
      "odds": { "redPrice": "10/9", "bluePrice": "10/8" },
      "tvChannel": "ช่อง 5 HD",
      "stream": {
        "url": "https://lnwthailive.online/api/iptv/stream/10000129?stk=api_token_xxx",
        "type": "hls"
      }
    }
  ]
}
```

---

### 6.6 หมวดวัวชนและไก่ชนถ่ายทอดสด (`GET /api/public/wuachon`)
* **Query Parameters:** `type=all` หรือ `wuachon` หรือ `cock`
* **ตัวอย่าง Response (205 รายการ):**
```json
{
  "ok": true,
  "total": 205,
  "tier": "enterprise",
  "data": [
    {
      "id": 69130,
      "roundName": "ยกที่ 4 - ไก่ชน สนามชนไก่เรืองชัย",
      "type": "cock",
      "typeLabel": "ไก่ชน",
      "redCorner": { "name": "ซุ้ม ส.สมหมาย" },
      "blueCorner": { "name": "ซุ้ม เพชรนำชัย" },
      "status": "live",
      "isLive": true,
      "stream": {
        "url": "https://lnwthailive.online/api/public/wuachon/stream?code=CH5&stk=api_token_sample",
        "type": "hls"
      }
    }
  ]
}
```

---

### 6.7 หมวดทีวีดิจิตอลและ IPTV (`GET /api/iptv/channels`)
* **ตัวอย่าง Response:**
```json
{
  "ok": true,
  "tier": "enterprise",
  "data": {
    "categories": [
      {
        "id": "digital_tv",
        "name": "ดิจิทัลทีวี & ฟรีทีวี (Digital TV)",
        "channels": [
          {
            "id": 10000127,
            "name": "CH 3 HD",
            "logo": "https://lnwthailive.online/logo/3hd.png",
            "stream_url": "https://lnwthailive.online/api/iptv/stream/10000127?stk=api_token_xxx",
            "isDisabled": false
          }
        ]
      }
    ]
  }
}
```

---

### 6.8 หมวดบทวิเคราะห์บอล VIP 14 จุด (`GET /api/analyse/today`)
* **ตัวอย่าง Response:**
```json
{
  "ok": true,
  "tier": "enterprise",
  "data": {
    "date": "2026-08-16",
    "type": "today",
    "matches": [
      {
        "id": 280217,
        "name": "อาร์เซน่อล VS แมนเชสเตอร์ ซิตี้",
        "matchDatetime": "2026-08-16T21:00:00+07:00",
        "trend": "เจ้าบ้านชนะ 35%, เสมอ 30%, เยือนชนะ 35%",
        "pick": "รอง อาร์เซน่อล สู้ยิบตา"
      }
    ]
  }
}
```

---

## 7. คู่มือการเชื่อมต่อระบบถ่ายทอดสด HLS

```
[ขั้นตอนที่ 1: Backend ดึงข้อมูล]           [ขั้นตอนที่ 2: ส่ง URL ให้ Client]         [ขั้นตอนที่ 3: Client เล่นวิดีโอ]
  Backend -> API                            Backend -> Frontend Browser                Frontend -> HLS CDN Proxy
  รับ stream_url ที่มี ?stk=...             ส่งลิงก์ตรงให้ Video Player                Video Player โหลด m3u8 & เล่นภาพ
```

### ⚠️ กฎเหล็กสำคัญป้องกันอาการ จอดำ / Error 403 Forbidden:
1. **ระบบมีการล็อก IP (IP-Binding):** Token `stk` จะทำการจดจำ IP ของเครื่องแรกที่เรียกเปิดวิดีโอ
2. **ห้าม Backend ทำการ Ping หรือ Fetch URL สตรีมมิ่งเด็ดขาด:** หาก Backend ร้องขอ URL นั้นไป ระบบจะผูก Token เข้ากับ IP ของ Server และเมื่อผู้ใช้ปลายทางเปิดดู จะถูกปฏิเสธด้วยรหัส **403 Forbidden** ทันที
3. **แนวทางปฏิบัติ:** ส่ง `stream_url` ไปให้ Browser หรือ Mobile App ของผู้ใช้ เพื่อให้เครื่องเล่นวิดีโอ (Video Player) เป็นผู้โหลดโดยตรง

---

## 8. ตัวอย่างโค้ดเชื่อมต่อระบบจริง (Production Code Examples)

---

### 8.1 Node.js / TypeScript

```typescript
import axios from 'axios';

const API_KEY = 'tgl-enterprise-8655529a5afc52d0';
const BASE_URL = 'https://lnwthailive.online';

const api = axios.create({
  baseURL: BASE_URL,
  headers: {
    'x-api-key': API_KEY,
    'Accept': 'application/json',
  },
  timeout: 8000,
});

// 1. ดึงตารางบอลสด AskMeBet
async function getAmbLiveMatches() {
  const { data } = await api.get('/api/askmebet/live');
  console.log(`[AMB Live] กำลังเตะสด ${data.live_count} คู่`);
  return data.live_now;
}

// 2. ดึงกีฬาสากล (เช่น บาสเกตบอล, เทนนิส, วอลเลย์บอล, เบสบอล)
async function getMultiSport(sportType: string) {
  const { data } = await api.get('/api/ge-sports', {
    params: { type: sportType }
  });
  console.log(`[Multi-Sport: ${sportType}] พบทั้งหมด ${data.count} แมตช์`);
  data.matches.forEach((m: any) => {
    console.log(`- [${m.league}] ${m.teamHome} vs ${m.teamAway} | สกอร์: ${m.score} (${m.matchStatus})`);
  });
  return data.matches;
}

// 3. ดึง iFrame Embed Player ของ AMB
async function getAmbEmbed(matchId: string) {
  const { data } = await api.get('/api/askmebet/embed', {
    params: { matchId }
  });
  console.log(`[Embed URL]: ${data.embed_url}`);
  return data;
}

async function run() {
  await getAmbLiveMatches();
  await getMultiSport('Basketball');
  await getMultiSport('Tennis');
  await getMultiSport('Volleyball');
  await getAmbEmbed('72151048');
}

run();
```

---

### 8.2 PHP (cURL & OOP Multi-Sports SDK)

```php
<?php
declare(strict_types=1);

class ThaiGoLiveEnterpriseSDK {
    private string $apiKey;
    private string $baseUrl;

    public function __construct(string $apiKey = "tgl-enterprise-8655529a5afc52d0", string $baseUrl = "https://lnwthailive.online") {
        $this->apiKey = $apiKey;
        $this->baseUrl = rtrim($baseUrl, '/');
    }

    private function get(string $endpoint, array $params = []): ?array {
        $url = $this->baseUrl . $endpoint;
        if (!empty($params)) {
            $url .= '?' . http_build_query($params);
        }

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_HTTPHEADER => [
                "x-api-key: " . $this->apiKey,
                "Accept: application/json"
            ],
            CURLOPT_SSL_VERIFYPEER => true
        ]);

        $res = curl_exec($ch);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return ($code === 200) ? json_decode($res, true) : null;
    }

    // ดึงบอลสด AMB
    public function getAmbLive(): ?array {
        return $this->get('/api/askmebet/live');
    }

    // ดึง Embed iFrame Player
    public function getAmbEmbed(string $matchId): ?array {
        return $this->get('/api/askmebet/embed', ['matchId' => $matchId]);
    }

    // ดึงกีฬาสากล (Basketball, Tennis, Volleyball, Baseball, Fighting ฯลฯ)
    public function getSports(string $type = 'Basketball'): ?array {
        return $this->get('/api/ge-sports', ['type' => $type]);
    }

    // ดึงมวยพักยก
    public function getMuayPakyok(): ?array {
        return $this->get('/api/public/muay-pakyok');
    }

    // ดึงวัวชน/ไก่ชน
    public function getWuachon(): ?array {
        return $this->get('/api/public/wuachon', ['type' => 'all']);
    }
}

// ใช้งานจริง
$sdk = new ThaiGoLiveEnterpriseSDK("tgl-enterprise-8655529a5afc52d0");

// ตัวอย่างดึงบาสเกตบอล
$basketball = $sdk->getSports('Basketball');
if ($basketball && $basketball['success']) {
    echo "<h3>รายการบาสเกตบอลสด (" . $basketball['count'] . " แมตช์)</h3>";
    foreach ($basketball['matches'] as $m) {
        echo "<p>[{$m['league']}] {$m['teamHome']} vs {$m['teamAway']} - สกอร์: {$m['score']} ({$m['matchStatus']})</p>";
    }
}
?>
```

---

### 8.3 Python (Requests SDK)

```python
import requests
from typing import Optional, Dict, Any, List

class ThaiGoLiveSDK:
    def __init__(self, api_key: str = "tgl-enterprise-8655529a5afc52d0", base_url: str = "https://lnwthailive.online"):
        self.api_key = api_key
        self.base_url = base_url.rstrip("/")
        self.headers = {"x-api-key": self.api_key, "Accept": "application/json"}

    def get_amb_live(self) -> Optional[Dict[str, Any]]:
        r = requests.get(f"{self.base_url}/api/askmebet/live", headers=self.headers, timeout=10)
        return r.json() if r.status_code == 200 else None

    def get_amb_embed(self, match_id: str) -> Optional[Dict[str, Any]]:
        r = requests.get(f"{self.base_url}/api/askmebet/embed", headers=self.headers, params={"matchId": match_id}, timeout=10)
        return r.json() if r.status_code == 200 else None

    def get_sports(self, sport_type: str = "Basketball") -> Optional[Dict[str, Any]]:
        r = requests.get(f"{self.base_url}/api/ge-sports", headers=self.headers, params={"type": sport_type}, timeout=10)
        return r.json() if r.status_code == 200 else None

if __name__ == "__main__":
    sdk = ThaiGoLiveSDK("tgl-enterprise-8655529a5afc52d0")
    
    # 1. ทดสอบดึงบาสเกตบอล
    bball = sdk.get_sports("Basketball")
    print(f"บาสเกตบอล: {bball.get('count')} แมตช์")
    for m in bball.get("matches", [])[:3]:
        print(f"- [{m['league']}] {m['teamHome']} vs {m['teamAway']} -> {m['score']}")

    # 2. ทดสอบดึงเทนนิส
    tennis = sdk.get_sports("Tennis")
    print(f"\nเทนนิส: {tennis.get('count')} แมตช์")
    for m in tennis.get("matches", [])[:3]:
        print(f"- [{m['league']}] {m['teamHome']} vs {m['teamAway']} -> {m['score']}")
```

---

### 8.4 Frontend React / Vue / Vanilla JS Embed Component

```tsx
import React, { useEffect, useState } from 'react';

interface MatchEmbedProps {
  matchId: string;
  apiKey?: string;
}

export const AmbFootballPlayer: React.FC<MatchEmbedProps> = ({ 
  matchId, 
  apiKey = 'tgl-enterprise-8655529a5afc52d0' 
}) => {
  const [embedUrl, setEmbedUrl] = useState<string | null>(null);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    setLoading(true);
    setError(null);

    fetch(`https://lnwthailive.online/api/askmebet/embed?matchId=${matchId}&api_key=${apiKey}`)
      .then((res) => res.json())
      .then((data) => {
        if (data.ok && data.embed_url) {
          setEmbedUrl(data.embed_url);
        } else {
          setError(data.error || 'สัญญาณถ่ายทอดสดยังไม่พร้อมใช้งาน');
        }
      })
      .catch((err) => setError('เกิดข้อผิดพลาดในการเชื่อมต่อเซิร์ฟเวอร์'))
      .finally(() => setLoading(false));
  }, [matchId, apiKey]);

  if (loading) {
    return <div className="p-8 text-center bg-slate-900 text-white rounded-xl">กำลังโหลดสัญญาณถ่ายทอดสด...</div>;
  }

  if (error) {
    return <div className="p-8 text-center bg-red-950/40 text-red-400 border border-red-800 rounded-xl">{error}</div>;
  }

  return (
    <div className="relative w-full aspect-video rounded-xl overflow-hidden shadow-2xl bg-black border border-slate-800">
      <iframe
        src={embedUrl!}
        title="Live Football Player"
        className="w-full h-full border-0"
        allow="autoplay; fullscreen; encrypted-media"
        allowFullScreen
      />
    </div>
  );
};
```

---

### 8.5 HTML5 + Hls.js Video Player

```html
<!DOCTYPE html>
<html lang="th">
<head>
  <meta charset="UTF-8">
  <title>ระบบถ่ายทอดสดกีฬา - ThaiGoLive Player</title>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <style>
    body {
      background-color: #0d1117;
      color: #ffffff;
      font-family: sans-serif;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      min-height: 100vh;
      margin: 0;
    }
    .player-container {
      width: 100%;
      max-width: 960px;
      background: #161b22;
      border-radius: 16px;
      overflow: hidden;
    }
    video { width: 100%; height: auto; display: block; }
  </style>
</head>
<body>

  <div class="player-container">
    <video id="liveVideo" controls autoplay playsinline muted></video>
  </div>

  <script>
    const video = document.getElementById('liveVideo');
    const streamUrl = 'https://lnwthailive.online/api/iptv/stream/10000127?stk=api_token_sample';

    if (Hls.isSupported()) {
      const hls = new Hls({ enableWorker: true, lowLatencyMode: true });
      hls.loadSource(streamUrl);
      hls.attachMedia(video);
      hls.on(Hls.Events.MANIFEST_PARSED, () => video.play());
    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
      video.src = streamUrl;
      video.play();
    }
  </script>
</body>
</html>
```

---

### 8.6 WordPress Integration (การเชื่อมต่อสำหรับ WordPress ผ่าน Transients Caching, Shortcodes, และ Elementor)

สำหรับผู้พัฒนาและเจ้าของเว็บไซต์ที่ใช้งาน **WordPress** (รวมถึงการใช้งานร่วมกับ **Elementor**, **WPBakery**, หรือ **Gutenberg**) แนะนำให้ปฏิบัติตามแนวทางนี้เพื่อความเร็วสูงสุดระดับ **0.01 – 0.05 วินาทีต่อหน้าเว็บ** และป้องกันปัญหาเว็บหน่วงหรือติด Rate Limit

#### ⚡ กฎเหล็กสำคัญสำหรับ WordPress:
> **คำเตือน (Crucial Performance Rule):** ห้ามเรียก `wp_remote_get()` ลงใน Template ตรงๆ โดยไม่มีระบบแคชเด็ดขาด เพราะหากมีผู้เข้าชมพร้อมกัน 1,000 คน จะทำให้ WordPress ยิงคำขอออกไปยังเซิร์ฟเวอร์ภายนอก 1,000 ครั้งพร้อมกัน ส่งผลให้เว็บโหลดช้ามาก (1-3 วินาที)
> **แนวทางแก้ไข:** ให้ใช้ **WordPress Transients API Caching** (`get_transient` และ `set_transient`) เก็บผลลัพธ์ไว้ 30 - 60 วินาที จะทำให้ผู้เข้าชมคนที่ 2–1,000 โหลดข้อมูลเสร็จทันทีจากแคชในเครื่อง

---

#### 8.6.1 โค้ดเชื่อมต่อระบบแบบ OOP พร้อมระบบแคช (WordPress Connector Class)
นำโค้ดด้านล่างนี้ไปวางไว้ในไฟล์ `functions.php` ของธีม หรือสร้างเป็น Custom Plugin:

```php
<?php
/**
 * Plugin Name: ThaiGoLive Sports & Live Player Connector
 * Description: เชื่อมต่อ API ดึงข้อมูลกีฬาและ Embed Player จาก ThaiGoLive พร้อมระบบแคชความเร็วสูง
 * Version: 1.5.0
 * Author: ThaiGoLive Dev Team
 */

if (!defined('ABSPATH')) exit;

class ThaiGoLive_WP {
    private static $api_key = 'tgl-enterprise-8655529a5afc52d0'; // ระบุ API Key ของคุณที่นี่
    private static $base_url = 'https://lnwthailive.online';

    /**
     * ฟังก์ชันแกนกลางในการดึงข้อมูลจาก API พร้อม Transients Caching
     */
    public static function get($endpoint, $params = array(), $cache_seconds = 30) {
        $cache_key = 'tgl_' . md5($endpoint . serialize($params));

        // 1. อ่านจากแคชใน WordPress ก่อน (ส่งกลับทันทีใน 0.005 วินาที)
        $cached_data = get_transient($cache_key);
        if (false !== $cached_data) {
            return $cached_data;
        }

        // 2. ประกอบ URL
        $url = rtrim(self::$base_url, '/') . $endpoint;
        if (!empty($params)) {
            $url = add_query_arg($params, $url);
        }

        // 3. ยิง HTTP Request ผ่าน WordPress HTTP API
        $response = wp_remote_get($url, array(
            'timeout'     => 8,
            'redirection' => 3,
            'headers'     => array(
                'x-api-key' => self::$api_key,
                'Accept'    => 'application/json',
            ),
        ));

        if (is_wp_error($response)) {
            error_log('[ThaiGoLive WP] API Request Error: ' . $response->get_error_message());
            return false;
        }

        $code = wp_remote_retrieve_response_code($response);
        if ($code !== 200) {
            return false;
        }

        $body = wp_remote_retrieve_body($response);
        $data = json_decode($body, true);

        // 4. บันทึกผลลัพธ์ลงแคชชั่วคราว
        if (!empty($data)) {
            set_transient($cache_key, $data, $cache_seconds);
        }

        return $data;
    }

    /**
     * ดึงผลบอลสด / รายการแข่งขันวันนี้
     */
    public static function get_matches($sport = 'football') {
        if ($sport === 'football') {
            return self::get('/api/public/matches?sport=football', array(), 20);
        }
        return self::get('/api/ge-sports', array('type' => $sport), 20);
    }

    /**
     * ดึงตารางคะแนน (แคช 300 วินาที = 5 นาที)
     */
    public static function get_standings() {
        return self::get('/api/public/standings', array(), 300);
    }
}
```

---

#### 8.6.2 สร้าง Shortcode สำเร็จรูปสำหรับใช้งานในหน้าเว็บ
เพิ่มโค้ดนี้ลงใน `functions.php` เพื่อให้สามารถพิมพ์ Shortcode ใน Elementor, Gutenberg หรือ Widget ได้ทันที:

```php
// 1. Shortcode แสดงตารางบอลสด / กีฬาสด: [tgl_live_matches sport="football" count="10"]
add_shortcode('tgl_live_matches', function($atts) {
    $atts = shortcode_atts(array(
        'sport' => 'football',
        'count' => 10,
    ), $atts);

    $res = ThaiGoLive_WP::get_matches($atts['sport']);
    $matches = !empty($res['data']) ? $res['data'] : (!empty($res['matches']) ? $res['matches'] : array());

    if (empty($matches)) {
        return '<div style="padding:15px;background:#1e2030;color:#94a3b8;border-radius:12px;text-align:center;">ยังไม่มีรายการแข่งขันในขณะนี้</div>';
    }

    ob_start();
    ?>
    <div class="tgl-matches-container" style="display:grid;gap:10px;font-family:sans-serif;">
      <?php 
      $shown = 0;
      foreach ($matches as $m): 
          if ($shown++ >= intval($atts['count'])) break;
          $home = esc_html($m['teamHome'] ?? $m['home'] ?? 'ทีมเหย้า');
          $away = esc_html($m['teamAway'] ?? $m['away'] ?? 'ทีมเยือน');
          $score = esc_html($m['score'] ?? 'vs');
          $league = esc_html($m['league'] ?? 'ทั่วไป');
          $isLive = !empty($m['isLive']);
          $homeLogo = !empty($m['homeLogo']) ? esc_url($m['homeLogo']) : '';
          $awayLogo = !empty($m['awayLogo']) ? esc_url($m['awayLogo']) : '';
      ?>
        <div style="background:#131525;border:1px solid #2a2d45;border-radius:12px;padding:12px 18px;display:flex;align-items:center;justify-content:space-between;color:#fff;">
          <div style="font-size:12px;color:#f97316;min-width:110px;font-weight:600;">[<?php echo $league; ?>]</div>
          <div style="flex:1;display:flex;align-items:center;justify-content:center;gap:16px;font-size:14px;font-weight:bold;">
            <span style="display:flex;align-items:center;gap:8px;">
              <?php if ($homeLogo): ?><img src="<?php echo $homeLogo; ?>" style="width:24px;height:24px;object-fit:contain;" /><?php endif; ?>
              <?php echo $home; ?>
            </span>
            <span style="background:<?php echo $isLive ? '#22c55e20' : '#ffffff10'; ?>;color:<?php echo $isLive ? '#22c55e' : '#94a3b8'; ?>;padding:3px 12px;border-radius:8px;font-family:monospace;">
              <?php echo $score; ?>
            </span>
            <span style="display:flex;align-items:center;gap:8px;">
              <?php echo $away; ?>
              <?php if ($awayLogo): ?><img src="<?php echo $awayLogo; ?>" style="width:24px;height:24px;object-fit:contain;" /><?php endif; ?>
            </span>
          </div>
          <div style="font-size:12px;min-width:70px;text-align:right;">
            <?php if ($isLive): ?>
              <span style="color:#22c55e;font-weight:bold;">🔴 สด</span>
            <?php else: ?>
              <span style="color:#94a3b8;"><?php echo esc_html($m['time'] ?? 'รอแข่ง'); ?></span>
            <?php endif; ?>
          </div>
        </div>
      <?php endforeach; ?>
    </div>
    <?php
    return ob_get_clean();
});

// 2. Shortcode ฝังเครื่องเล่นวิดีโอสด: [tgl_player match_id="104859" height="520"]
add_shortcode('tgl_player', function($atts) {
    $atts = shortcode_atts(array(
        'match_id' => '',
        'height'   => '520',
    ), $atts);

    if (empty($atts['match_id'])) {
        return '<p style="color:red;">โปรดระบุ match_id ใน Shortcode เช่น [tgl_player match_id="104859"]</p>';
    }

    $playerUrl = 'https://lnwthailive.online/player/iframe?matchId=' . urlencode($atts['match_id']) . '&key=tgl-enterprise-8655529a5afc52d0';

    return '<div style="position:relative;width:100%;height:' . intval($atts['height']) . 'px;border-radius:16px;overflow:hidden;background:#000;box-shadow:0 10px 30px rgba(0,0,0,0.5);">' .
           '<iframe src="' . esc_url($playerUrl) . '" width="100%" height="100%" frameborder="0" allowfullscreen allow="autoplay; encrypted-media"></iframe>' .
           '</div>';
});
```

---

#### 8.6.3 การนำไปใช้งานบน Elementor & Gutenberg

1. **ฝังตารางแข่งสดด้วย Elementor:**
   - ในหน้าแก้ไขของ Elementor ให้ค้นหา Widget ชื่อ **"Shortcode"**
   - ลาก Widget ลงในหน้าเว็บ แล้วใส่โค้ด:
     ```text
     [tgl_live_matches sport="football" count="10"]
     ```
   - หรือเปลี่ยนเป็นกีฬาอื่น: `sport="basketball"`, `sport="tennis"`, `sport="volleyball"`
2. **ฝังเครื่องเล่นวิดีโอสดด้วย Elementor (Responsive 16:9):**
   - ลาก Widget ชื่อ **"HTML"** ลงในหน้า Elementor แล้ววางโค้ด Responsive นี้:
     ```html
     <div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:16px;">
       <iframe 
         src="https://lnwthailive.online/player/iframe?matchId=104859&key=tgl-enterprise-8655529a5afc52d0" 
         style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;" 
         allowfullscreen 
         allow="autoplay; encrypted-media">
       </iframe>
     </div>
     ```

---

## 9. การจัดการข้อผิดพลาดและรหัสสถานะ

| รหัสสถานะ (Status Code) | ความหมาย | สาเหตุและแนวทางแก้ไข |
|---|---|---|
| **`200 OK`** | สำเร็จ | การประมวลผลคำขอสำเร็จและส่งข้อมูลกลับ |
| **`400 Bad Request`** | ข้อมูลคำขอไม่ถูกต้อง | ตรวจสอบ Parameters เช่น ขาด `matchId`, `type` หรือ `ids` |
| **`401 Unauthorized`** | ขาดการยืนยันตัวตน | ไม่ได้ระบุ `x-api-key` หรือ API Key ไม่ถูกต้อง |
| **`403 Forbidden`** | สิทธิ์ไม่ถูกต้อง / Token ผิด | API Key หมดอายุ, ถูกระงับ, สิทธิ์ไม่ครอบคลุมกีฬาที่เรียก หรือ IP Mismatch ในการสตรีม |
| **`404 Not Found`** | ไม่พบข้อมูล | ID แมตช์หรือช่องสตรีมมิ่งที่ระบุไม่มีอยู่ในระบบ |
| **`429 Too Many Requests`**| เรียกใช้งานเกินโควตา | อัตราการยิง Request เกินกว่า Rate Limit ของแพ็กเกจ (แนะนำให้หน่วงเวลาหรือทำ Cache) |
| **`444 Stream Unavailable`**| ไม่มีสัญญาณสตรีม | แมตช์ดังกล่าวยังไม่เริ่มแข่งขัน หรือการแข่งขันจบสิ้นลงแล้ว |
| **`500 Internal Error`** | เซิร์ฟเวอร์ขัดข้อง | ระบบจะสลับไปใช้ In-Memory Cache สำรองโดยอัตโนมัติ |

---

## 10. ข้อควรระวังสำคัญและแนวทางปฏิบัติ (Performance & Best Practices)

1. **การทำ Caching เพื่อความเร็วสูงสุด (Latency < 50ms):**
   * ระบบ API ของเราส่ง Header `Cache-Control: public, max-age=..., s-maxage=..., stale-while-revalidate=...` มาให้โดยอัตโนมัติ 
   * **ฝั่ง WordPress:** ใช้ `get_transient` และ `set_transient` แคช 20–30 วินาที เพื่อให้หน้าเว็บโหลดเสร็จใน 0.05 วินาที
   * **ตารางบอลสด AskMeBet (`/api/askmebet/live`):** แนะนำ Cache **10 - 15 วินาที**
   * **กีฬาสากล (`/api/ge-sports`):** แนะนำ Cache **15 - 20 วินาที**
   * **ผลบอลสดระบบหลัก (`/api/public/matches`):** แนะนำ Cache **15 - 20 วินาที**
   * **ตารางคะแนน & บทวิเคราะห์ (`/api/public/standings`):** แนะนำ Cache **120 - 300 วินาที**
   * **มวยพักยก & ราคาสด (`/api/public/muay-pakyok`):** แนะนำ Cache **5 - 10 วินาที**
2. **การป้องกันปัญหา Embed iFrame ข้ามโดเมน (CORS & Sandboxing):**
   * หากฝังใน `<iframe>` ให้แน่ใจว่าไม่ได้จำกัดสิทธิ์ `allow-scripts` หรือ `allow-same-origin` เพราะตัวเล่นวิดีโอต้องใช้ JavaScript ในการถอดรหัสภาพ HLS
3. **การตั้งค่า Timeout ใน Backend:**
   * ควรกำหนด Network Request Timeout อยู่ที่ **5 - 8 วินาที** และมี Fallback แสดงผลหากเกิดปัญหาเครือข่าย

---
**© 2026 LnwthaiLive / ThaiGoLive Infrastructure Platform. All rights reserved.**
