ข้อมูลเปิด POPNIX Flood Open data API
ระดับน้ำคลอง น้ำท่วมถนน แม่น้ำ และฝนของกรุงเทพฯ ชุดเดียวกับที่หน้าเว็บใช้ เป็น JSON อ่านอย่างเดียว ไม่ต้องสมัคร ไม่ต้องใช้ key
ทุกปลายทางอยู่ที่ https://flood.pop.in.th ใช้ GET ตอบ application/json; charset=utf-8 ข้อมูลเป็นของจุดวัดของหน่วยงานรัฐที่ POPNIX Flood นำมาจัดรูปแบบใหม่ ไม่ใช่ประกาศทางการ
Terms of useเงื่อนไขการใช้
- ใช้ได้ฟรีทั้งงานส่วนตัว งานข่าว และงานเชิงพาณิชย์ โดยต้องให้เครดิตตามหัวข้อถัดไป
- ไม่ใช่ประกาศเตือนภัยทางการ ห้ามนำไปแสดงเป็นประกาศเตือนภัย หรือทำให้ผู้ใช้เข้าใจว่าเป็นข้อมูลจากหน่วยงานรัฐโดยตรง ประกาศทางการให้ติดตามกรุงเทพมหานครและกรมอุตุนิยมวิทยา
- ไม่มีการรับประกันความถูกต้อง ครบถ้วน หรือความต่อเนื่อง ต้นทางอาจเงียบหรือส่งค่าผิดได้ ตรวจเวลาของข้อมูล (
latest,measured_at) และstaleทุกครั้งก่อนแสดงผล - ค่าที่วัดเป็นของจุดติดตั้งเท่านั้น ถนนหรือคลองช่วงอื่นอาจลึกหรือตื้นกว่านี้ พื้นที่ที่ไม่มีจุดวัดให้บอกว่าไม่มีจุดวัด ห้ามสรุปว่าไม่มีน้ำ
- อย่าเรียกถี่: ข้อมูลเปลี่ยนทุก 5 ถึง 10 นาที เรียกปลายทางเดิมนาทีละครั้งก็เพียงพอ แอปที่มีผู้ใช้มากให้ดึงที่ server ของคุณแล้ว cache ไว้ อย่าให้เครื่องผู้ใช้ทุกเครื่องเรียกตรง
Attributionการให้เครดิต
แสดงข้อความนี้ใกล้กับข้อมูลที่นำไปใช้ และลิงก์กลับมาที่ https://flood.pop.in.th
ข้อมูล: สำนักการระบายน้ำ กรุงเทพมหานคร ผ่าน POPNIX Flood (flood.pop.in.th)
- แม่น้ำเจ้าพระยาและฝน: เพิ่ม "สถาบันสารสนเทศทรัพยากรน้ำ (สสน.)"
- ถ้าใช้การแบ่งตามเขต: ขอบเขตเขตมาจาก © OpenStreetMap contributors (ODbL)
- ภาษาอังกฤษ: Data: Drainage and Sewerage Department, Bangkok Metropolitan Administration, via POPNIX Flood (flood.pop.in.th)
Rate limits and cachingการจำกัดความถี่และ cache
- จำกัด 30 ครั้งต่อนาทีต่อ IP รวมทุกปลายทาง
/api_*.php(รวม/api_mcp.php) เผื่อกระชากได้ถึง 40 ครั้ง เกินแล้วได้ HTTP 429 - server เก็บผลไว้เป็นไฟล์และคำนวณใหม่ตามรอบในตาราง ระหว่างนั้นทุกคนได้ผลเดียวกัน ส่ง
Cache-Control: public, max-ageมาด้วย ให้ cache ตามนั้น - header
X-Cache:HITได้จาก cache,MISSคำนวณใหม่,STALEฐานข้อมูลมีปัญหาจึงตอบผลเก่าที่ไม่เกิน 1 ชั่วโมง (ดูเวลาในsummary.generated/latest) - ข้อผิดพลาด:
400 {"error": "..."}พารามิเตอร์ไม่ถูกต้อง,503 {"error": "data temporarily unavailable"}ยังไม่มีข้อมูลให้ตอบ,429เรียกถี่เกิน
| ปลายทาง | คำนวณใหม่ทุก | max-age |
|---|---|---|
api_overview, api_roads | 30 วิ / 10 นาที | 60 / 300 วิ |
api_history, api_series | 60 วิ / 10 นาที | 60 / 300 วิ |
api_frames, api_roads?frames=1 | 2 นาที / 10 นาที | 120 / 600 วิ |
api_river, api_rain, api_reports, api_live | 2 นาที, 5 นาที, 60 วิ, 30 วิ | ตาม header |
ต้นทางอัปเดต: คลองทุก 10 นาที, ถนนทุก 5 ถึง 10 นาที, แม่น้ำและฝนทุก 20 นาที ข้อมูลของ กทม. ตอบช้าหรือปฏิเสธเป็นช่วง ๆ ดูสถานะปัจจุบันได้ที่ สถานะแหล่งข้อมูล
CORSเรียกจากเว็บอื่นได้
ปลายทางอ่านอย่างเดียวทุกตัวส่ง Access-Control-Allow-Origin: * หน้าเว็บของคุณเรียกด้วย fetch() จากเบราว์เซอร์ได้ตรง ๆ (GET เท่านั้น ไม่ต้องส่ง cookie หรือ header พิเศษ) ถ้าเว็บมีผู้ชมมาก ให้ดึงผ่าน server ของคุณและ cache ไว้แทน เพราะการจำกัดความถี่นับต่อ IP
Common parameters and formatsพารามิเตอร์และรูปแบบที่ใช้ร่วมกัน
at=YYYY-MM-DD HH:MM(หรือใช้Tคั่น วินาทีใส่หรือไม่ก็ได้) = ดูย้อนหลัง ณ เวลานั้น เวลาไทย ตั้งแต่ 2020-01-01 ถึงไม่เกิน 1 วันข้างหน้า รูปแบบอื่นได้ 400 ไม่ใส่ = ปัจจุบัน- เวลาในผลลัพธ์เป็นเวลาไทย (UTC+7) รูปแบบ
YYYY-MM-DD HH:MM:SSไม่มีเขตเวลาต่อท้าย - ระดับน้ำคลองและแม่น้ำเป็นเมตรเหนือระดับน้ำทะเลปานกลาง (ม.รทก.) ไม่ใช่ความลึก ความลึกน้ำบนถนนเป็นเซนติเมตร
null= ไม่มีค่า (ต้นทางไม่ส่งหรือจุดวัดขัดข้อง) ห้ามแปลงเป็น 0
Endpointsปลายทางข้อมูล
GET /api_overview.phpระดับน้ำคลองทุกจุดวัด
| ชื่อ | ค่า | ความหมาย |
|---|---|---|
w | 30, 60 (ค่าเริ่มต้น), 180, 360, 1440 | เทียบการเปลี่ยนแปลงกับกี่นาทีก่อน |
at | เวลาไทย | ดูย้อนหลัง |
level: crit ถึงระดับวิกฤต, warn เกินระดับเฝ้าระวัง, ok ต่ำกว่าเกณฑ์เฝ้าระวัง, unk มีค่าแต่ไม่มีเกณฑ์ให้เทียบ, none ไม่มีค่า | trend: up, down, flat (เปลี่ยนไม่ถึง 2 ซม.), null ไม่มีค่าเทียบ | online: ส่งค่าภายใน 3 ชั่วโมง | spark: ระดับน้ำ 6 ชั่วโมงล่าสุด ไม่เกิน 24 จุด | summary.stale: ค่าล่าสุดเก่ากว่า 45 นาที | summary.scrape_failing: รอบล่าสุดที่ดึงจากต้นทางไม่สำเร็จ
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{
"window": 60, "at": null,
"range": {"min": "2026-09-29 15:00:00", "max": "2026-09-30 14:20:00"},
"summary": {
"stations": 202, "online": 186, "offline": 16, "compared": 170,
"up": 40, "down": 95, "flat": 35, "avg_delta": -0.012,
"daily": {"up": 60, "down": 110, "flat": 10},
"warn": 17, "crit": 51, "unk": 7, "latest": "2026-09-30 14:20:00",
"tide": {"date": "2026-09-30", "high_am": {"t": "09:22", "v": 1.12}, "low_am": {"t": "03:54", "v": -0.53},
"high_pm": {"t": "19:35", "v": 1.3}, "low_pm": {"t": "13:10", "v": 0.1}},
"generated": "2026-09-30 14:24:05", "age_min": 4, "stale": false,
"scraped": "2026-09-30 14:21:09", "scrape_failing": false
},
"stations": [
{"id": 125, "name": "ค.พระยาสุเรนทร์ ถ.จตุโชติ", "river": "คลองพระยาสุเรนทร์",
"lat": 13.87621, "lng": 100.68614, "warn": 1.0, "crit": 1.2, "bed": -1.0, "bank": 1.5,
"wl": 1.55, "max_day": 1.56, "max_yday": 1.52, "measured_at": "2026-09-30 14:20:00",
"online": true, "delta": 0.01, "trend": "flat", "level": "crit", "delta_day": 0.04,
"spark": [1.5, 1.51, 1.52, 1.53, 1.54, 1.55]}
]
}
GET /api_history.php?id=125ระดับน้ำย้อนหลังของจุดวัดเดียว
id (จำเป็น) = stations[].id จาก api_overview, h = 24 (ค่าเริ่มต้น), 72, 168, 720 ชั่วโมง, at ดูย้อนหลัง ช่วงเกิน 72 ชั่วโมงเฉลี่ยเป็นช่วง ๆ และมี mx/mn สูงสุดต่ำสุดของช่วง
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{"id": 125, "hours": 24, "points": [{"t": "2026-09-30 14:10:00", "wl": 1.54}, {"t": "2026-09-30 14:20:00", "wl": 1.55}]}
GET /api_series.phpภาพรวมย้อนหลังของทั้งเมือง
h = 24, 72, 168, 720 ชั่วโมง ต่อช่วงเวลา (bucket วินาที): ระดับน้ำเฉลี่ย จำนวนจุดที่ส่งค่า และจำนวนจุดที่เกินเกณฑ์
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{"bucket": 600, "rows": [{"t": "2026-09-30 14:10:00", "avg_wl": 0.412, "n": 181, "over_warn": 61, "over_crit": 44}]}
GET /api_frames.phpเฟรมเล่นย้อนหลังรายจุดวัด
h = 24, 72, 168 ชั่วโมง เฟรมที่ i คือเวลา t0 + i × step วินาที, null = ช่วงนั้นไม่มีค่า
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{"step": 600, "t0": "2026-09-29 14:20:00", "n": 145, "st": {"125": [1.41, null, 1.42], "51": [0.62, 0.62, 0.63]}}
GET /api_roads.phpน้ำท่วมถนนและอุโมงค์ทุกจุดวัด
at ดูย้อนหลัง, frames=1 = เฟรมย้อนหลัง 24 ชั่วโมงรูปแบบเดียวกับ api_frames (key เป็น code ค่าคือความลึกสูงสุดของช่วง)
level: flood ลึกเกิน 10 ซม., slight 5 ถึง 10 ซม., dry ไม่เกิน 5 ซม., off ขัดข้องหรือปิดปรับปรุง (ไม่ส่งค่าเกิน 30 นาที) | kind: 1 ถนน, 2 อุโมงค์ | grp 2 = ชุดที่วัดเป็นขั้น 5 ซม. ได้สูงสุด 20 ซม. ค่า 20 ของชุดนี้หมายถึง อย่างน้อย 20 ซม. | since: เริ่มท่วมเมื่อไร | district: เขตตามข้อมูลของ กทม.
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{
"summary": {"latest": "2026-09-30 14:25:00", "total": 247, "flood": 16, "slight": 6, "dry": 212, "off": 13,
"generated": "2026-09-30 14:26:40", "age_min": 1, "stale": false,
"scraped": "2026-09-30 14:25:05", "scrape_failing": false},
"roads": [
{"code": "FL.MBR.02", "kind": 1, "grp": 1, "name": "ถ.สุวินทวงศ์ (ถ.หทัยราษฎร์)", "road": "ถนนสุวินทวงศ์",
"district": "มีนบุรี", "dir": null, "lat": 13.81, "lng": 100.73, "msg_fail": null,
"depth": 20, "measured_at": "2026-09-30 14:25:00", "flood_max": 22,
"level": "flood", "delta": 0, "since": "2026-09-30 11:20:00"}
]
}
GET /api_river.phpแม่น้ำเจ้าพระยาจากนครสวรรค์ถึงกรุงเทพฯ
flows = อัตราการไหล (ลบ.ม./วินาที) ความเร็วกระแสน้ำและพื้นที่หน้าตัดที่จุดวัดของ กทม. (สะพานพระราม 8 บนแม่น้ำเจ้าพระยาก่อน ตามด้วยจุดในคลอง) | at ดูย้อนหลัง สถานีเรียงจากเหนือลงใต้ (order) | diff = ระดับน้ำลบตลิ่ง (ติดลบ = ต่ำกว่าตลิ่ง) | trend เทียบราว 1 ชั่วโมงก่อน (±2 ซม.) | spark รายชั่วโมง 24 ค่า เก่าไปใหม่ | ข้อมูล สสน. และ กทม.
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{
"summary": {"latest": "2026-09-30 14:00:00", "age_min": 26, "stale": false, "count": 18,
"worst": {"code": "1234", "name": "สถานีตัวอย่าง", "diff": -0.42}, "scraped": "2026-09-30 14:09:30", "scrape_failing": false},
"stations": [
{"code": "1234", "name": "สถานีตัวอย่าง", "name_en": "Example", "agency": "สสน.", "basin": "เจ้าพระยา", "river": "แม่น้ำเจ้าพระยา",
"lat": 13.75, "lng": 100.49, "order": 12, "wl": 1.58, "bank": 2.0, "diff": -0.42, "ground": -6.0,
"measured_at": "2026-09-30 14:00:00", "online": true, "delta": 0.03, "trend": "up", "situation": 4, "flow": null,
"spark": [1.2, 1.25, 1.31, null, 1.58]}
],
"notes": {"dam_release": null}
}
GET /api_rain.phpปริมาณฝนรอบกรุงเทพฯ
at ดูย้อนหลัง | r1h, r3h, r24h = ฝนสะสม 1, 3, 24 ชั่วโมง (มม.) | summary.raining = จำนวนสถานีที่มีฝนตอนนี้ | ข้อมูล สสน. และสถานีวัดฝน 122 สถานีของ กทม. (code ขึ้นต้น bma:, agency = กทม.)
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{
"summary": {"latest": "2026-09-30 14:00:00", "age_min": 26, "stale": false, "count": 64,
"max1h": {"name": "สถานีตัวอย่าง", "v": 12.5}, "max24h": {"name": "สถานีตัวอย่าง", "v": 48.0}, "raining": 9},
"stations": [
{"code": "5678", "name": "สถานีตัวอย่าง", "district": "มีนบุรี", "agency": "สสน.", "lat": 13.81, "lng": 100.73,
"measured_at": "2026-09-30 14:00:00", "r1h": 12.5, "r3h": 20.0, "r24h": 48.0, "online": true}
]
}
GET /api_reports.phpรายงานน้ำท่วมจากผู้ใช้ (ยังไม่ได้ตรวจสอบ)
รวมรายงานจากผู้ใช้เป็นช่องพื้นที่ แสดงรายงานไม่เกิน ttl_min นาที | depth: 0 ผู้รายงานบอกว่าแห้ง, 1 ระดับข้อเท้า (ไม่เกิน 10 ซม.), 2 ครึ่งน่อง (10 ถึง 25 ซม.), 3 ระดับเข่า (25 ถึง 50 ซม.), 4 ระดับเอวขึ้นไป (เกิน 50 ซม.) | n จำนวนรายงาน, last เวลาของรายงานล่าสุด, unconfirmed ยังไม่ได้รับการยืนยัน | เป็นคำบอกเล่าของผู้ใช้ ไม่ใช่ค่าจากเครื่องวัด
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{"at": null, "generated": "2026-09-30 14:26:00", "ttl_min": 180, "cells": [{"cell": "2763:20147", "lat": 13.8175, "lng": 100.7375, "depth": 2, "n": 3, "last": "2026-09-30 14:05:00", "unconfirmed": false, "district": "มีนบุรี"}]}
GET /api_live.phpจำนวนผู้เปิดหน้าเว็บตอนนี้และสิ่งที่ดูมากที่สุด
online = หน้าที่ยังเปิดอยู่ใน 2 นาทีล่าสุด | top[].kind: station, camera, road พร้อม id และจำนวนผู้เปิดดูใน 15 นาที n (แสดงเมื่อมีอย่างน้อย 3 คน) | change = จำนวนจุดวัดคลองที่ดีขึ้น/แย่ลง และจุดวัดถนนที่แห้ง/มีน้ำ เทียบ h ชั่วโมงก่อน (null เมื่อข้อมูลไม่สด)
ตัวอย่าง (ค่าสมมุติ ตัดให้สั้น)
{"generated": "2026-09-30 14:26:10", "online": 42, "top": [{"kind": "station", "id": "125", "n": 7}], "change": {"h": 6, "since": "2026-09-30 08:20:00", "canal_better": 3, "canal_worse": 1, "road_dry": 2, "road_wet": 0}}
Embed cardฝังการ์ดสรุปในเว็บของคุณ
การ์ดเล็กสำหรับเว็บข่าว คอนโด และเพจชุมชน ขนาด 320 x 420 ขึ้นไป ยืดเต็มความกว้างกรอบได้ รีเฟรชเองทุก 5 นาที ลิงก์ในการ์ดเปิด flood.pop.in.th ในแท็บใหม่ ไม่มีโฆษณา
<iframe src="https://flood.pop.in.th/embed/?d=min-buri" width="320" height="420" style="border:0;border-radius:16px;max-width:100%" loading="lazy" title="ระดับน้ำ เขตมีนบุรี จาก POPNIX Flood"></iframe>
?d=รับชื่อเขตภาษาไทย (มีนบุรี) ชื่ออังกฤษ (Min Buri) หรือ slug (min-buri) ไม่ใส่ = สรุปทั้งกรุงเทพฯ- กรุณาอย่าบังหรือตัดส่วนเครดิตและข้อความ "ไม่ใช่ประกาศทางการ" ที่ท้ายการ์ด
slug ของทั้ง 50 เขต
| เขต | English | slug |
|---|---|---|
| คลองเตย | Khlong Toei | khlong-toei |
| คลองสาน | Khlong San | khlong-san |
| คลองสามวา | Khlong Sam Wa | khlong-sam-wa |
| คันนายาว | Khan Na Yao | khan-na-yao |
| จตุจักร | Chatuchak | chatuchak |
| จอมทอง | Chom Thong | chom-thong |
| ดอนเมือง | Don Mueang | don-mueang |
| ดินแดง | Din Daeng | din-daeng |
| ดุสิต | Dusit | dusit |
| ตลิ่งชัน | Taling Chan | taling-chan |
| ทวีวัฒนา | Thawi Watthana | thawi-watthana |
| ทุ่งครุ | Thung Khru | thung-khru |
| ธนบุรี | Thon Buri | thon-buri |
| บางกอกน้อย | Bangkok Noi | bangkok-noi |
| บางกอกใหญ่ | Bangkok Yai | bangkok-yai |
| บางกะปิ | Bang Kapi | bang-kapi |
| บางขุนเทียน | Bang Khun Thian | bang-khun-thian |
| บางเขน | Bang Khen | bang-khen |
| บางคอแหลม | Bang Kho Laem | bang-kho-laem |
| บางแค | Bang Khae | bang-khae |
| บางซื่อ | Bang Sue | bang-sue |
| บางนา | Bang Na | bang-na |
| บางบอน | Bang Bon | bang-bon |
| บางพลัด | Bang Phlat | bang-phlat |
| บางรัก | Bang Rak | bang-rak |
| บึงกุ่ม | Bueng Kum | bueng-kum |
| ปทุมวัน | Pathum Wan | pathum-wan |
| ประเวศ | Prawet | prawet |
| ป้อมปราบศัตรูพ่าย | Pom Prap Sattru Phai | pom-prap-sattru-phai |
| พญาไท | Phaya Thai | phaya-thai |
| พระโขนง | Phra Khanong | phra-khanong |
| พระนคร | Phra Nakhon | phra-nakhon |
| ภาษีเจริญ | Phasi Charoen | phasi-charoen |
| มีนบุรี | Min Buri | min-buri |
| ยานนาวา | Yan Nawa | yan-nawa |
| ราชเทวี | Ratchathewi | ratchathewi |
| ราษฎร์บูรณะ | Rat Burana | rat-burana |
| ลาดกระบัง | Lat Krabang | lat-krabang |
| ลาดพร้าว | Lat Phrao | lat-phrao |
| วังทองหลาง | Wang Thonglang | wang-thonglang |
| วัฒนา | Vadhana | vadhana |
| สวนหลวง | Suan Luang | suan-luang |
| สะพานสูง | Saphan Sung | saphan-sung |
| สัมพันธวงศ์ | Samphanthawong | samphanthawong |
| สาทร | Sathon | sathon |
| สายไหม | Sai Mai | sai-mai |
| หนองแขม | Nong Khaem | nong-khaem |
| หนองจอก | Nong Chok | nong-chok |
| หลักสี่ | Lak Si | lak-si |
| ห้วยขวาง | Huai Khwang | huai-khwang |
MCP serverให้ผู้ช่วย AI ตอบเรื่องน้ำท่วมจากข้อมูลจริง
ผู้ช่วย AI ที่รองรับ Model Context Protocol (เช่น Claude) ต่อเข้ามาถามระดับน้ำจากข้อมูลชุดเดียวกับหน้าเว็บได้ คำตอบเป็นภาษาไทยพร้อมตัวเลขและเวลาของข้อมูล และมีตัวเลขดิบใน structuredContent
- ปลายทาง:
https://flood.pop.in.th/api_mcp.php - รูปแบบ: Streamable HTTP แบบ stateless, JSON-RPC 2.0 ทาง POST ตอบ JSON ก้อนเดียว ไม่มี SSE ไม่มี session ไม่ต้องใช้ key, protocol
2025-06-18 - อ่านอย่างเดียว ใช้โควตาเดียวกับ API (30 ครั้งต่อนาทีต่อ IP) ขนาดคำขอไม่เกิน 16 KB
| ชื่อ | ตอบอะไร |
|---|---|
flood_overview | ภาพรวมทั้งกรุงเทพฯ: คลองวิกฤต/เฝ้าระวัง น้ำกำลังขึ้นหรือลด ถนนน้ำท่วม และถนนที่น้ำลึกที่สุด |
flood_district(name) | สรุปรายเขต รับชื่อไทย อังกฤษ หรือ slug |
flood_near(lat, lng) | จุดวัดคลอง 5 จุดและจุดวัดถนน 3 จุดที่ใกล้พิกัดที่สุด พร้อมระยะทาง (lat 13.4 ถึง 14.2, lng 100.1 ถึง 101.1) |
flood_search(query) | ค้นเขต จุดวัดคลอง และจุดวัดถนนจากชื่อ |
flood_river() | แม่น้ำเจ้าพระยาเทียบตลิ่ง (เมื่อมีข้อมูลแม่น้ำแล้ว) |
Claude Code:
claude mcp add --transport http popnix-flood https://flood.pop.in.th/api_mcp.php
ไฟล์ตั้งค่าแบบ mcpServers (Claude Code .mcp.json และโปรแกรมอื่นที่รองรับเซิร์ฟเวอร์ระยะไกลแบบ HTTP) ส่วน Claude บนเว็บและแอปเพิ่มเป็น custom connector ด้วย URL เดียวกัน
{
"mcpServers": {
"popnix-flood": {"type": "http", "url": "https://flood.pop.in.th/api_mcp.php"}
}
}
ลองเรียกด้วย curl:
curl -s https://flood.pop.in.th/api_mcp.php -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"flood_district","arguments":{"name":"มีนบุรี"}}}'
llms.txtสรุปเว็บนี้สำหรับโมเดลภาษา
/llms.txt สรุปว่าเว็บนี้คืออะไร ข้อมูลมาจากไหน ปลายทาง API และ MCP และข้อควรระวังในการตีความ ตามรูปแบบของ llmstxt.org