Datalake Export API

REST API สำหรับดึงข้อมูล Gold layer — รองรับ JSON, CORS, Pagination

Base URL
http://api.data.montri.co.th/api/v1
Auth Header
X-API-Key: <key>
Format
application/json UTF-8
Rate Limit
X-RateLimit-Remaining
🔐 Security Model
✅ Per-key Scopes
แต่ละ key กำหนดได้ว่าเข้าถึง endpoint ไหน ตัวอย่างเช่น HR ได้แค่ vehicles:read + summary:read
✅ Rate Limiting (60–120 req/min)
Sliding window per key — response header X-RateLimit-Remaining บอก quota ที่เหลือ
✅ Key Hashing (SHA-256)
ไม่เก็บ plain text key ในไฟล์ — ถ้า api_keys.json หลุด ก็ใช้ key ไม่ได้
✅ Key Expiry
กำหนด expires_at ให้ key หมดอายุอัตโนมัติ
✅ IP Allowlist
จำกัดได้ว่า key นี้ใช้ได้จาก IP หรือ CIDR ใด เช่น 192.168.1.0/24
✅ Audit Log
บันทึกทุก request → api_audit.jsonl — timestamp, key_id, IP, endpoint, status, ms
⚠️ HTTPS (แนะนำ)
ควรวาง Nginx reverse proxy + TLS certificate ก่อน expose ออก internet
⚠️ Read-Only API
ทุก endpoint เป็น GET เท่านั้น — ไม่มีการแก้ไขข้อมูล
Scopes ทั้งหมด
vehicles:read jobs:read fuel:read gps:read summary:read
Response format
// Success
{ "ok": true, "data": [...], "meta": { "total": 100, "limit": 50, "offset": 0 } }

// Error
{ "ok": false, "error": "Forbidden", "message": "Key นี้ไม่มีสิทธิ์ 'fuel:read'" }

// Rate limit exceeded
HTTP 429  Retry-After: 23
{ "ok": false, "error": "Too Many Requests", "message": "เกิน 60 req/min — รอ 23 วินาที" }
GET/api/v1/status No Auth · Cached 60s

Health check + จำนวน record ใน Gold layer

curl http://api.data.montri.co.th/api/v1/status
GET/api/v1/vehicles vehicles:read

รายการรถทั้งหมดจาก vehicle master

ParamTypeDefaultคำอธิบาย
statusstringfull | no_gps | no_master
brandstringpartial match
limitint100max 500
offsetint0pagination
curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/vehicles?status=full&limit=50"
GET/api/v1/jobs jobs:read

ใบงาน พร้อม GPS km, น้ำมัน, plan vs actual

ParamTypeDefaultคำอธิบาย
fromdatetoday-7YYYY-MM-DD
todatetodayYYYY-MM-DD
carstringcar_code เช่น M047
typestringFieldTrip | BusRent
has_gps1เฉพาะงานที่มี GPS
has_fuel1เฉพาะงานที่มีน้ำมัน
limitint100max 500
curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/jobs?from=2026-05-09&to=2026-05-09&has_gps=1"
GET/api/v1/fuel fuel:read

รายการเติมน้ำมัน FlowCo

curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/fuel?car=M047&from=2026-05-01&to=2026-05-11"
GET/api/v1/gps/daily gps:read

GPS summary รายวัน ต่อรถ (actual km, max speed)

curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/gps/daily?from=2026-05-05&to=2026-05-11"
GET/api/v1/summary/daily summary:read

KPI รายวัน — เหมาะสำหรับ Dashboard KPI card ของหน่วยงานอื่น

curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/summary/daily?date=2026-05-09"
GET/api/v1/summary/period summary:read

สรุปช่วงวัน + by job type + daily trend + top cars

curl -H "X-API-Key: KEY" "http://api.data.montri.co.th/api/v1/summary/period?from=2026-05-05&to=2026-05-11"
🛡 Admin — Key Management

ต้องส่ง X-Admin-Key (ตั้งใน .env API_ADMIN_KEY=...)

GET/api/v1/admin/keys

ดูรายการ key ทั้งหมด (แสดงแค่ hash prefix ไม่แสดง plain key)

POST/api/v1/admin/keys
{
  "name":        "HR Dashboard",
  "owner":       "hr@company.com",
  "scopes":      ["vehicles:read", "summary:read"],
  "rate_limit":  30,
  "allowed_ips": ["192.168.1.0/24"],
  "expires_at":  "2026-12-31"
}

⚠️ Response จะแสดง key plain text ครั้งเดียวเท่านั้น บันทึกให้ดี

PATCH/api/v1/admin/keys/{kid}

แก้ไข scope / rate_limit / expires_at / active ของ key

DELETE/api/v1/admin/keys/{kid}

ปิดการใช้งาน key (soft delete)

GET/api/v1/admin/audit

ดู audit log ล่าสุด (?key_id=... &endpoint=... &limit=100)

🧪 ทดสอบ API