API สาธารณะสำหรับนักพัฒนา

ดึงข้อมูลระบบสารสนเทศของมหาวิทยาลัยราชภัฏพระนคร — รายการระบบ สถานะ เวอร์ชัน ความก้าวหน้า และคู่มือ — ไปแสดงในแอปพลิเคชันหรือเว็บของท่านได้ โดยไม่ต้องขอคีย์และไม่ต้องยืนยันตัวตน

BASE URL https://devtrack.pnru.ac.th/api/public/v1
GET เท่านั้น
อ่านอย่างเดียว
60 ครั้ง/นาที
ต่อหนึ่งไอพี
แคช 5 นาที
Cache-Control
ไม่ต้องล็อกอิน
ไม่มี API key

เริ่มต้นใช้งาน

  • ทุกปลายทางเป็น HTTP GET และตอบกลับเป็น JSON (UTF-8) — การเรียกด้วย POST/PUT/DELETE ถูกปฏิเสธเสมอ แม้ผู้เรียกจะล็อกอินเป็นผู้ดูแลระบบก็ตาม
  • ไม่ต้องส่ง header ใดเป็นพิเศษ ไม่มี API key และไม่มี token
  • จำกัดการเรียกไว้ที่ 60 ครั้งต่อนาทีต่อหนึ่งไอพี เกินกว่านั้นจะได้รหัส 429 — แอปที่ต้องรีเฟรชถี่ ๆ ควรเก็บผลลัพธ์ไว้ในเครื่องแทนการยิงซ้ำ
  • ผลลัพธ์แนบ Cache-Control: public, max-age=300 ข้อมูลที่ได้จึงช้ากว่าของจริงได้ไม่เกินราว 5 นาที
  • วันที่อยู่ในรูป ISO-8601 — ชนิด date เป็น 2026-09-21 ส่วน datetime เป็น 2026-09-21T14:30:00 (เขตเวลา Asia/Bangkok)
  • เรียกจากเบราว์เซอร์ข้ามโดเมนยังไม่ได้ — ขณะนี้ยังไม่ได้เปิด CORS แอปเนทีฟ (Android / iOS / Flutter) และการเรียกจากฝั่งเซิร์ฟเวอร์ใช้ได้ตามปกติ ส่วนเว็บที่รันคนละโดเมนต้องเรียกผ่านฝั่งเซิร์ฟเวอร์ของตนเอง หากต้องการให้เปิด CORS กรุณาแจ้ง itc@pnru.ac.th

รูปแบบผลลัพธ์

ทุกปลายทางห่อผลลัพธ์ด้วยโครงเดียวกัน ข้อมูลจริงอยู่ในช่อง data เสมอ แอปจึงเขียนตัวแกะผลลัพธ์ชุดเดียวใช้ได้กับทุกปลายทาง

สำเร็จ
{
  "success": true,
  "message": "สำเร็จ",
  "data": { ... },
  "timestamp": "2026-09-21T14:30:00.123"
}
ไม่สำเร็จ
{
  "success": false,
  "message": "ไม่พบระบบที่เปิดเผย: XXX",
  "data": null,
  "timestamp": "2026-09-21T14:30:00.123"
}
ช่องชนิดความหมาย
successboolean สำเร็จหรือไม่ — ตรวจช่องนี้ก่อนอ่าน data
messagestring ข้อความภาษาไทย นำไปแสดงต่อผู้ใช้ได้โดยตรง
dataobject | array | null ข้อมูลจริง รูปร่างต่างกันไปตามปลายทาง
timestampdatetime เวลาที่เซิร์ฟเวอร์ตอบกลับ

รหัสสถานะและข้อผิดพลาด

รหัสความหมายและสิ่งที่แอปควรทำ
200 สำเร็จ อ่านข้อมูลจาก data ได้
400 พารามิเตอร์ผิดรูปแบบ เช่นส่ง status ที่ไม่มีอยู่จริง — ตรวจค่าที่ส่งกับตารางค่าคงที่ด้านล่าง
404 ไม่พบรายการที่ขอ หรือรายการนั้นไม่ได้เปิดเผยสู่สาธารณะ — ทั้งสองกรณีตอบเหมือนกันโดยตั้งใจ แอปควรแสดงว่า "ไม่พบข้อมูล" เท่านั้น
429 เรียกถี่เกินโควตา — หยุดรอแล้วค่อยลองใหม่ (แนะนำให้ถอยเป็นช่วง ๆ ไม่ใช่ยิงซ้ำทันที)
500 ข้อผิดพลาดฝั่งเซิร์ฟเวอร์ — ระบบไม่ส่งรายละเอียดภายในออกมา หากพบบ่อยกรุณาแจ้ง itc@pnru.ac.th

ปลายทางทั้งหมด

สถิติภาพรวม

GET /api/public/v1/summary

ตัวเลขสรุปของระบบที่เปิดเผยผ่านเอพีไอทั้งหมด เหมาะกับหน้าแรกหรือการ์ดสรุปในแอป ทุกตัวเลขนับจากข้อมูลที่เปิดเผยเท่านั้น จึงไม่บอกใบ้ว่ามีระบบที่ซ่อนอยู่กี่ระบบ

ช่อง data — อ็อบเจกต์เดียว
ช่อง ชนิด คำอธิบาย
totalSystems number จำนวนระบบที่เปิดเผยทั้งหมด
inProduction number จำนวนระบบที่ใช้งานจริงอยู่
inDevelopment number จำนวนระบบที่อยู่ระหว่างพัฒนา
releasesThisYear number จำนวนเวอร์ชันที่ออกในปีนี้
ผลลัพธ์จริง

รายการระบบงาน (แบ่งหน้า)

GET /api/public/v1/systems

รายการระบบที่เปิดเผยผ่านเอพีไอ ค้นหาและกรองตามสถานะได้ ใช้ทำหน้ารายการหลักของแอป ผลลัพธ์เป็นข้อมูลแบบแบ่งหน้า รายการจริงอยู่ใน data.content

พารามิเตอร์
ชื่อ ชนิด บังคับ คำอธิบาย
keyword string ไม่บังคับ คำค้นในชื่อระบบหรือรหัสระบบ
status enum AppStatus ไม่บังคับ กรองเฉพาะสถานะที่ต้องการ เช่น PRODUCTION
page number ไม่บังคับ หน้าที่ต้องการ เริ่มนับจาก 0 (ค่าเริ่มต้น 0)
size number ไม่บังคับ จำนวนรายการต่อหน้า ค่าเริ่มต้น 20 และถูกจำกัดไว้ไม่เกิน 100
ช่อง data — อ็อบเจกต์แบบแบ่งหน้า — รายการจริงอยู่ใน data.content
ช่อง ชนิด คำอธิบาย
content[] array อาร์เรย์ของระบบงานในหน้านี้
content[].id number รหัสอ้างอิงภายในของระบบ
content[].appCode string รหัสระบบ ใช้เป็นกุญแจเรียกปลายทางรายละเอียด
content[].displayName string ชื่อที่ใช้แสดง (ภาษาไทย)
content[].nameEn string | null ชื่อภาษาอังกฤษ
content[].summary string | null คำอธิบายย่อ 1-2 บรรทัด
content[].appType enum AppType ประเภทของระบบ
content[].status enum AppStatus สถานะปัจจุบัน
content[].iconClass string | null ชื่อคลาสไอคอน Bootstrap Icons ที่ผู้ดูแลกำหนดไว้ เช่น bi-mortarboard
content[].progressPercent number ความก้าวหน้า 0-100
content[].currentVersion string | null เวอร์ชันปัจจุบัน
content[].lastReleaseDate date | null วันที่ออกเวอร์ชันล่าสุด
content[].goLiveDate date | null วันที่เปิดใช้งานจริง
content[].orgName string | null หน่วยงานเจ้าของระบบ
content[].userGroups[] array of enum UserGroup กลุ่มผู้ใช้งานของระบบ มีได้มากกว่าหนึ่งกลุ่ม เช่น ["STD","ADV"] ใช้กรองว่าผู้ใช้ของแอปคุณเกี่ยวข้องกับระบบนี้หรือไม่
content[].urls[] array ลิงก์ที่เปิดเผยของระบบนี้ — เฉพาะลิงก์ของ PRODUCTION ชนิดหน้าหลัก/เอกสาร ที่ผู้ดูแลติ๊กเปิดเผยไว้รายรายการ ระบบที่ยังไม่ติ๊กลิงก์ใดไว้จะได้อาร์เรย์ว่าง
content[].urls[].url string ที่อยู่เต็มของลิงก์ พร้อมนำไปเปิดได้ทันที
content[].urls[].label string ข้อความสำหรับแสดงบนปุ่ม เช่น "เข้าใช้งานระบบ" (ไม่ได้ตั้งไว้จะได้ค่า "เข้าใช้งาน")
content[].urls[].urlType enum UrlType ชนิดของลิงก์ MAIN = หน้าเข้าใช้งาน, DOC = เอกสาร/คู่มือออนไลน์
totalElements number จำนวนระบบทั้งหมดตามเงื่อนไขที่ค้น
totalPages number จำนวนหน้าทั้งหมด
number number เลขหน้าปัจจุบัน เริ่มจาก 0
size number จำนวนรายการต่อหน้าที่ใช้จริง
first / last boolean เป็นหน้าแรก / หน้าสุดท้ายหรือไม่
ผลลัพธ์จริง

รายละเอียดระบบงาน 1 ระบบ

GET /api/public/v1/systems/{code}

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

พารามิเตอร์
ชื่อ ชนิด บังคับ คำอธิบาย
code string (อยู่ในเส้นทาง) ต้องระบุ รหัสระบบจากช่อง appCode เช่น THESIS-SEARCH
ช่อง data — อ็อบเจกต์เดียว
ช่อง ชนิด คำอธิบาย
app object ข้อมูลระบบ โครงเดียวกับรายการใน /systems
app.urls[] array ลิงก์ที่เปิดเผยของระบบนี้ แต่ละรายการมี url, label และ urlType
versions[] array ประวัติเวอร์ชัน เรียงจากใหม่ไปเก่า แต่ละรายการมี versionNo, versionType, releaseDate, note และ changes[]
versions[].changes[] array หัวข้อการเปลี่ยนแปลงของเวอร์ชันนั้น มี changeType และ title
milestones[] array หมุดหมายโครงการ มี title, phase, status, progressPercent, plannedEnd
announcements[] array ประกาศที่ยังมีผลของระบบนี้ มี title, content, noticeType, startAt, endAt, pinned
ผลลัพธ์จริง

ความก้าวหน้าของโครงการ

GET /api/public/v1/progress

โครงการที่ยังพัฒนาไม่เสร็จ พร้อมหมุดหมายรายขั้น ใช้ทำหน้าติดตามความคืบหน้าในแอป

ช่อง data — อาร์เรย์
ช่อง ชนิด คำอธิบาย
appCode string รหัสระบบ
displayName string ชื่อที่ใช้แสดง
orgName string | null หน่วยงานเจ้าของ
progressPercent number ความก้าวหน้ารวม 0-100
milestones[] array หมุดหมายของโครงการ มี title, phase, status, progressPercent, plannedEnd
ผลลัพธ์จริง

ระบบแยกตามกลุ่มผู้ใช้งาน

GET /api/public/v1/user-groups

ระบบที่ใช้งานจริง (PRODUCTION) จัดกลุ่มตามผู้ใช้ เช่น นักศึกษา อาจารย์ บุคลากร พร้อมลิงก์เข้าใช้งาน ใช้ทำหน้ารวมลิงก์ระบบสำหรับเผยแพร่ — ระบบหนึ่งอยู่ได้หลายกลุ่ม และระบบที่ยังไม่ได้ระบุกลุ่มผู้ใช้ (OTH) จะไม่ปรากฏในปลายทางนี้

พารามิเตอร์
ชื่อ ชนิด บังคับ คำอธิบาย
group enum UserGroup ไม่บังคับ เอาเฉพาะกลุ่มเดียว เช่น STD (ไม่ระบุ = ทุกกลุ่ม)
ช่อง data — อาร์เรย์ — หนึ่งรายการต่อหนึ่งกลุ่ม เรียงเป็น EXT, ADV, STD, USR เสมอ กลุ่มที่ไม่มีระบบได้ systems เป็นอาร์เรย์ว่าง
ช่อง ชนิด คำอธิบาย
group enum UserGroup รหัสกลุ่มผู้ใช้ เช่น STD
label string ชื่อกลุ่มภาษาไทย เช่น "นักศึกษา"
systems[] array ระบบที่กลุ่มนี้ใช้งานได้ เรียงตามชื่อ
systems[].appCode string รหัสระบบ
systems[].displayName string ชื่อที่ใช้แสดง
systems[].summary string | null คำอธิบายย่อ
systems[].iconClass string | null ชื่อคลาสไอคอน Bootstrap Icons
systems[].url string | null ลิงก์หน้าเข้าใช้งาน (ลิงก์ MAIN อันแรก) null เมื่อผู้ดูแลยังไม่ได้ติ๊กเปิดเผยลิงก์ไว้
systems[].urls[] array ลิงก์ที่เปิดเผยทั้งหมด มี url, label และ urlType
ผลลัพธ์จริง

ค่าคงที่ (enum)

JSON ส่งมาเฉพาะรหัสตัวพิมพ์ใหญ่ ไม่ได้ส่งคำแปลไทยมาด้วย แอปที่ต้องการแสดงภาษาไทยให้ใช้ตารางนี้เป็นตัวแปล และควรเผื่อกรณีเจอรหัสที่ยังไม่รู้จักไว้ด้วย เพราะอาจมีค่าใหม่เพิ่มในอนาคต

AppStatus
ใช้ที่ status ของระบบงาน
PLANNING วางแผน
DEVELOPING กำลังพัฒนา
UAT ทดสอบกับผู้ใช้
PRODUCTION ใช้งานจริง
MAINTENANCE ปรับปรุง/บำรุงรักษา
RETIRED ยกเลิกใช้งาน
AppType
ใช้ที่ appType ของระบบงาน
WEB เว็บแอปพลิเคชัน
API เว็บเซอร์วิส/API
MOBILE แอปพลิเคชันมือถือ
DESKTOP โปรแกรมบนเครื่อง
SERVICE บริการเบื้องหลัง
BATCH งานประมวลผลตามเวลา
UserGroup
ใช้ที่ userGroups[] ของระบบงาน
OTH ไม่ระบุ
STD นักศึกษา
ADV อาจารย์
USR บุคลากร
EXT บุคคลภายนอก
VersionType
ใช้ที่ versions[].versionType
MAJOR ปรับใหญ่
MINOR เพิ่มความสามารถ
PATCH แก้ไขย่อย
HOTFIX แก้ด่วน
ChangeType
ใช้ที่ versions[].changes[].changeType
FEATURE เพิ่มฟีเจอร์
IMPROVEMENT ปรับปรุง
BUGFIX แก้ข้อผิดพลาด
SECURITY ความปลอดภัย
DOCUMENT เอกสาร
UrlType
ใช้ที่ urls[].urlType
MAIN หน้าหลัก
DOC เอกสาร/คู่มือ
MilestonePhase
ใช้ที่ milestones[].phase
ANALYSIS วิเคราะห์
DESIGN ออกแบบ
DEVELOPMENT พัฒนา
TESTING ทดสอบ
UAT ทดสอบกับผู้ใช้
DEPLOY ติดตั้งใช้งาน
TRAINING อบรม
CLOSED ปิดโครงการ
MilestoneStatus
ใช้ที่ milestones[].status
NOT_STARTED ยังไม่เริ่ม
IN_PROGRESS กำลังดำเนินการ
DONE เสร็จแล้ว
DELAYED ล่าช้า
ON_HOLD ระงับชั่วคราว
NoticeType
ใช้ที่ announcements[].noticeType
INFO ข่าวสาร
MAINTENANCE ปิดปรับปรุง
INCIDENT เหตุขัดข้อง
RELEASE เวอร์ชันใหม่

ตัวอย่างโค้ด

curl -s "https://devtrack.pnru.ac.th/api/public/v1/systems?status=PRODUCTION&size=5"
const BASE = 'https://devtrack.pnru.ac.th/api/public/v1';

async function fetchSystems() {
  const res = await fetch(BASE + '/systems?status=PRODUCTION&size=20');
  if (res.status === 429) throw new Error('เรียกถี่เกินโควตา กรุณารอสักครู่');
  if (!res.ok) throw new Error('เรียก API ไม่สำเร็จ: ' + res.status);

  const body = await res.json();
  if (!body.success) throw new Error(body.message);

  return body.data.content;   // อาร์เรย์ของระบบงาน
}
import 'dart:convert';
import 'package:http/http.dart' as http;

const base = 'https://devtrack.pnru.ac.th/api/public/v1';

Future<List<dynamic>> fetchSystems() async {
  final res = await http.get(Uri.parse('$base/systems?size=20'));
  if (res.statusCode != 200) {
    throw Exception('เรียก API ไม่สำเร็จ: ${res.statusCode}');
  }

  // ต้องถอดรหัสเป็น UTF-8 เอง มิฉะนั้นภาษาไทยจะกลายเป็นอักขระเพี้ยน
  final body = jsonDecode(utf8.decode(res.bodyBytes));
  if (body['success'] != true) throw Exception(body['message']);

  return body['data']['content'] as List<dynamic>;
}
HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://devtrack.pnru.ac.th/api/public/v1/summary"))
        .header("Accept", "application/json")
        .GET()
        .build();

HttpResponse<String> response =
        client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));

เงื่อนไขการใช้ข้อมูล

  • ข้อมูลที่ API นี้ให้ คือข้อมูลชุดเดียวกับที่แสดงบนหน้าเว็บสาธารณะ ระบบที่ผู้ดูแลยังไม่ได้ติ๊กเปิดเผยจะไม่ปรากฏในผลลัพธ์ใดเลย
  • API นี้ ไม่เปิดเผย ไอพี ชื่อเครื่อง พอร์ต ระบบปฏิบัติการ ที่อยู่ repository ชื่อผู้พัฒนา อีเมล หรือเบอร์โทรใด ๆ
  • กรุณาอ้างอิงแหล่งที่มาเมื่อนำข้อมูลไปเผยแพร่ต่อ และไม่นำไปใช้ในทางที่ทำให้ เข้าใจสถานะการให้บริการของมหาวิทยาลัยผิดไปจากความจริง
  • สอบถามการใช้งาน ขอเพิ่มปลายทาง หรือขอเปิด CORS สำหรับโดเมนของท่าน ติดต่อสำนักวิทยบริการและเทคโนโลยีสารสนเทศ โทร 0-2544-8000 ต่อ 1100 · อีเมล itc@pnru.ac.th