API
3,963 รายการจากเอกสาร 77 จังหวัด เรียกเป็น JSON ได้ทันที ไม่ต้องสมัคร ไม่ต้องใช้ API key และไม่มี rate limit ทุก endpoint เป็นไฟล์นิ่งที่เสิร์ฟจาก CDN
เริ่มจากตรงนี้
index.json บอกทุก endpoint ที่มี พร้อม URL เต็มที่เรียกต่อได้เลย
curl -s https://260816-karemairodnare.vercel.app/api/v1/index.jsonEndpoint ทั้งหมด
ทุกเส้นทางขึ้นต้นด้วย https://260816-karemairodnare.vercel.app/api/v1
| เส้นทาง | คืนค่า | คำอธิบาย |
|---|---|---|
| /api/v1/index.json | endpoints[] | รายการ endpoint ทั้งหมด |
| /api/v1/meta.json | dataset | จำนวนเอกสาร หน้า และหมวดหมู่ของชุดข้อมูล |
| /api/v1/records.json | records[] | ทุกรายการในชุดข้อมูล 3963 รายการ |
| /api/v1/provinces.json | items[] | รายชื่อจังหวัด 77 รายการ พร้อมจำนวนคนและ URL ของแต่ละจังหวัด |
| /api/v1/provinces/{slug}.json | records[] | ทุกรายการในจังหวัดที่ระบุ |
| /api/v1/districts.json | items[] | รายชื่ออำเภอ 657 รายการ |
| /api/v1/districts/{slug}.json | records[] | ทุกรายการในอำเภอที่ระบุ |
| /api/v1/agencies.json | items[] | รายชื่อหน่วยงาน 1945 รายการ |
| /api/v1/agencies/{slug}.json | records[] | ทุกรายการในหน่วยงานที่ระบุ |
| /api/v1/openapi.json | OpenAPI 3.1 | สเปกสำหรับ generate client หรือเปิดใน Swagger UI |
ไม่มี endpoint รายบุคคลโดยตั้งใจ หน้าเว็บของแต่ละคนเปิดสาธารณะอยู่แล้ว และ records.json ก็มีครบทุกรายการ การเรียกรายหมวดจึงครอบคลุมการใช้งานจริงโดยไม่ต้องมีไฟล์แยกรายคนอีกหลายพันไฟล์
โครงสร้างคำตอบ
ทุก endpoint ห่อด้วยรูปแบบเดียวกัน — _meta บอกเวอร์ชัน วันที่ และข้อความกำกับ ส่วนข้อมูลอยู่ใน records หรือ items
{
"_meta": {
"version": 1,
"snapshot": "2025-08-21",
"site": "https://260816-karemairodnare.vercel.app",
"notice": "เอกสารต้นทางมาจากแหล่งเผยแพร่สาธารณะ ยังไม่ได้รับการยืนยัน…",
"kind": "province",
"name": "ภูเก็ต",
"slug": "ภูเก็ต",
"count": 12
},
"records": [
{
"id": "7b531cf1189eb6f0c4643494",
"name": "…",
"maskedId": "167xxxxxx0996",
"scoreChange": 44,
"agency": "อบต.…",
"district": "…",
"province": "ภูเก็ต",
"verificationSource": "ยืนยันจากเว็บไซต์หน่วยงาน",
"sources": [{ "file": "54_เพชรบูรณ์.pdf", "page": 2 }],
"url": "https://260816-karemairodnare.vercel.app/person/…"
}
]
}| ฟิลด์ | ชนิด | หมายเหตุ |
|---|---|---|
| id | string | ตัวระบุภายในชุดข้อมูล คงที่ตราบที่ยังเป็นเวอร์ชัน 1 |
| name | string | ชื่อตามที่ปรากฏในเอกสาร ไม่ได้แก้คำสะกด |
| maskedId | string | เลขที่ถูกปิดบางส่วนตามรูปแบบในเอกสาร ไม่ใช่ตัวระบุที่ยืนยันได้ลำพัง |
| scoreChange | number | ผลต่างคะแนนที่ระบุในเอกสาร |
| agency | string | หน่วยงานตามที่ระบุในเอกสาร |
| district | string | อำเภอ |
| province | string | จังหวัด |
| verificationSource | string | ที่มาของการตรวจทานรายการนั้น |
| sources | array | ชื่อไฟล์และเลขหน้าเอกสารต้นฉบับ มีอย่างน้อยหนึ่งรายการเสมอ |
| url | string | ลิงก์หน้าเว็บที่แสดงบริบทครบของรายการนั้น |
ตัวอย่างการใช้งาน
const res = await fetch("https://260816-karemairodnare.vercel.app/api/v1/provinces.json");
const { items } = await res.json();
// ทุกรายการมี url ที่ encode มาให้แล้ว จึงไม่ต้องประกอบ path ภาษาไทยเอง
const phuket = items.find((item) => item.name === "ภูเก็ต");
const { _meta, records } = await fetch(phuket.url).then((r) => r.json());
console.log(_meta.count, records[0].name, records[0].sources[0].file);import json, urllib.request
def get(url):
with urllib.request.urlopen(url) as res:
return json.load(res)
items = get("https://260816-karemairodnare.vercel.app/api/v1/provinces.json")["items"]
phuket = next(item for item in items if item["name"] == "ภูเก็ต")
data = get(phuket["url"])
print(data["_meta"]["count"], data["records"][0]["name"])curl -s https://260816-karemairodnare.vercel.app/api/v1/records.json \
| jq '.records | sort_by(-.scoreChange)[:10] | map({name, scoreChange, province})'เรื่อง slug ภาษาไทย
เส้นทางใช้ชื่อไทยตรงๆ เพื่อให้อ่านออกโดยไม่ต้องเปิดตารางเทียบ แต่ HTTP client บางตัวไม่ encode ให้อัตโนมัติ ทางที่ปลอดภัยที่สุดคืออ่านฟิลด์ url จากรายการหมวด ซึ่ง encode มาให้เรียบร้อยแล้ว ถ้าจำเป็นต้องประกอบเองให้ encode ทุกครั้ง
// ถ้ารู้ชื่ออยู่แล้วและไม่อยากดึงรายการหมวดก่อน ต้อง encode ชื่อเสมอ
const slug = encodeURIComponent("เพชรบูรณ์");
const url = "https://260816-karemairodnare.vercel.app/api/v1/provinces/" + slug + ".json";ข้อกำหนดทางเทคนิค
- ไม่ต้องยืนยันตัวตน ไม่มี API key ไม่มี rate limit และเปิด CORS ให้ทุก origin จึงเรียกจากเบราว์เซอร์ได้โดยตรง
- แคช
max-age=86400ต่อด้วย stale-while-revalidate ข้อมูลเปลี่ยนเฉพาะตอน deploy ใหม่ กรุณาเก็บผลไว้ใช้ซ้ำแทนการเรียกทุกครั้ง - เวอร์ชัน อยู่ทั้งในเส้นทาง (
/api/v1/) และใน_meta.versionการเพิ่มฟิลด์ถือว่ายังเข้ากันได้ ถ้าต้องเปลี่ยนโครงสร้างจะขึ้นv2โดยv1ยังอยู่ที่เดิม - OpenAPI 3.1 อยู่ที่ /api/v1/openapi.json เปิดใน Swagger UI หรือใช้ generate client ได้
- ดาวน์โหลดทั้งชุด ถ้าต้องการทำงานแบบออฟไลน์หรือเปิดในสเปรดชีต ใช้ไฟล์จากหน้า ชุดข้อมูล ซึ่งมี CSV ให้ด้วย
ก่อนนำไปใช้
- เอกสารต้นทางมาจากแหล่งเผยแพร่สาธารณะ ยังไม่ได้รับการยืนยันจากหน่วยงานใด และไม่ได้เป็นการระบุสถานะทางคดี ความผิด หรือคำพิพากษาของบุคคล ข้อความนี้อยู่ใน
_meta.noticeของทุกคำตอบ เพื่อให้ติดไปกับข้อมูลเสมอ แม้ผู้ใช้ปลายทางจะไม่เคยเห็นหน้านี้ - ชื่อที่คล้ายกันอาจเป็นคนละบุคคล ทุกแถวจึงมี
sourcesที่อ้างชื่อไฟล์และเลขหน้า ขอความกรุณาอย่าตัดฟิลด์นี้ออกเมื่อนำไปเผยแพร่ต่อ - การนำไปทำระบบค้นชื่อรายคน แจ้งเตือน หรือจัดอันดับบุคคล เป็นการใช้งานที่เกินกว่าความแม่นยำที่ชุดข้อมูลนี้รองรับได้
การอ้างอิง
ชุดข้อมูลการแก้ไขคะแนน ปี 2025. เรียบเรียงจากเอกสาร 77 จังหวัด. สืบค้นจาก https://260816-karemairodnare.vercel.app/api
วิธีการจัดทำและข้อจำกัดของชุดข้อมูลอยู่ในหน้า ที่มาและข้อจำกัด