Skip to Content
🚀 Welcome to Humansoft Open API Documentation

Get Location List

ดึงรายการสถานที่บันทึกเวลา (Location) ที่ลงทะเบียนในระบบ รองรับการกรองตามสถานะเผยแพร่ หน่วยงาน สิทธิ์การลงเวลาของพนักงาน การค้นหา และการแบ่งหน้า

ใช้ API นี้เพื่อค้นหา location_id ที่ต้องใช้ประกอบกับ Submit Time Attendance สำหรับการบันทึกเวลาประเภท Checkin, QR และ Facial

Endpoint นี้ไม่ต้องการสิทธิ์ (scope) พิเศษ — เรียกใช้ได้ด้วย API Key ที่ถูกต้องของระบบ

Endpoint

GET /api/v1/open-apis/locations/get-list

รองรับทั้ง GET (ส่งพารามิเตอร์เป็น Query String) และ POST (ส่งเป็น JSON Body) — โครงสร้างพารามิเตอร์เหมือนกัน

Request Parameters

พารามิเตอร์ทั้งหมดเป็น optional — เรียกโดยไม่ส่งพารามิเตอร์จะได้รายการสถานที่ทั้งหมด

ParameterTypeRequiredDescription
publish_flagstringNoกรองตามสถานะเผยแพร่ — Y หรือ N
sort_bystringNoเรียงลำดับผลลัพธ์ — order_no (default), location_name, location_id, location_group_code, created
sort_orderstringNoทิศทางการเรียง — ASC (default) หรือ DESC
searchstringNoค้นหาแบบ substring (ไม่แยกตัวพิมพ์เล็ก/ใหญ่) จาก location_name หรือ location_group_code — ยาวไม่เกิน 100 ตัวอักษร
location_group_codestringNoกรองตามรหัสกลุ่มสถานที่
location_idstringNoกรองตาม ID สถานที่ (raw ID เช่น "20260212D9F611580550")
employee_codestringNoรหัสพนักงาน (เช่น "EMP001") — คืนเฉพาะสถานที่ที่พนักงานคนนั้นมีสิทธิ์ลงเวลา (ดู Callout ด้านล่าง)
company_codestringNoรหัสบริษัท (เช่น "COMP-01")
branch_codestringNoรหัสสาขา (เช่น "BR-01")
department_codestringNoรหัสแผนก (เช่น "DEPT-IT")
division_codestringNoรหัสฝ่าย (เช่น "DIV-DEV")
section_codestringNoรหัสกอง (เช่น "SEC-WEB")
position_codestringNoรหัสตำแหน่งงาน (เช่น "POS-DEV")
_PAGEnumberNoเลขหน้าที่ต้องการ (เริ่มที่ 1)
_NUMBER_PER_PAGEnumberNoจำนวนรายการต่อหน้า (1–100, default 20 เมื่อเปิดการแบ่งหน้า)

ทุกพารามิเตอร์ *_code สามารถส่งเป็น internal ID แทนได้ (employee_id, company_id, branch_id, department_id, division_id, section_id, position_id) โดยใช้ค่า raw (ไม่ใช่ Base64) หากส่งทั้ง *_code และ *_id มาพร้อมกัน ระบบจะใช้ค่าจาก *_code เป็นหลัก

พฤติกรรมของ employee_code / employee_id

  • คืนเฉพาะสถานที่ที่พนักงานมีสิทธิ์ลงเวลา โดยไล่สิทธิ์แบบ cascade ตามลำดับ บริษัท → สาขา → แผนก → ฝ่าย → กอง → ตำแหน่ง → รายบุคคล
  • คืนเฉพาะสถานที่ที่ใช้งานได้ ณ วันที่เรียก API (สถานที่ที่ปิดในวันนั้น เช่นเปิดเฉพาะ จ.–ศ. เมื่อเรียกวันเสาร์ จะไม่แสดง)
  • คืนเฉพาะสถานที่ที่ publish_flag = Y — การส่ง publish_flag=N ร่วมกับ employee_code จะได้ payload ว่าง
  • ค้นเฉพาะพนักงานที่ยังทำงานอยู่ (active) — หากเป็นรหัสของพนักงานที่ลาออกแล้วหรือไม่มีอยู่จริง จะได้ HTTP 400 (not found)

การกรองด้วยหน่วยงาน (company_*, branch_*, department_*, division_*, section_*, position_*) เป็นการเทียบแบบตรงตัว (exact match) กับสิทธิ์ใน child[] ของแต่ละสถานที่ ไม่ไล่ลำดับชั้นให้ — สถานที่ที่ผูกสิทธิ์กว้างกว่า (เช่นสิทธิ์ระดับบริษัททั้งหมด) จะไม่ถูกคืนเมื่อกรองด้วย department_code หากต้องการสิทธิ์ที่แท้จริงของพนักงานรายบุคคลให้ใช้ employee_code

Response Format

Success Response (HTTP 200)

{ "code": "200", "message": "Success", "payload": [ { "location_id": "20260212D9F611580550", "location_group_code": "LOC001", "location_name": "อาคาร A", "location_latitude": "13.7563", "location_longitude": "100.5018", "location_radius": 100, "location_start": null, "location_end": null, "location_qrpath": "", "Mon": 1, "Tue": 1, "Wed": 1, "Thu": 1, "Fri": 1, "Sat": 0, "Sun": 0, "publish_flag": "Y", "created": "2026-02-10 09:00:00", "order_no": 1, "child": [ { "location_id": "20260212D9F611580551", "company_id": "1", "branch_id": "0", "department_id": "10", "division_id": "0", "section_id": "0", "section_lv01_id": "0", "section_lv02_id": "0", "section_lv03_id": "0", "section_lv04_id": "0", "section_lv05_id": "0", "position_id": "0", "employee_id": "0", "global_flag": "N", "auth_name": "บริษัท เอชเอ็มเอส จำกัด => ฝ่ายเทคโนโลยีสารสนเทศ" } ] } ], "_PAGINATION": { "_TOTAL_RECORDS": 45, "_PAGE": 1, "_NUMBER_PER_PAGE": 20 } }

_PAGINATION จะอยู่ใน response เสมอ — หากไม่ระบุ ทั้ง _PAGE และ _NUMBER_PER_PAGE ระบบจะคืนรายการทั้งหมดใน payload โดย _PAGINATION._NUMBER_PER_PAGE เท่ากับจำนวนรายการทั้งหมด หากระบุมาอย่างน้อยหนึ่งตัว ระบบจะแบ่งหน้าและเติมค่า default ให้ตัวที่ขาด (response ไม่มีฟิลด์จำนวนหน้าทั้งหมด — คำนวณเองได้จาก ceil(_TOTAL_RECORDS / _NUMBER_PER_PAGE))

Error Response - Validation Failed (HTTP 400)

{ "code": "400", "message": "Failed", "errors": [ "'publish_flag' must be one of: Y, N" ] }

Error Response - Not Found (HTTP 400)

เมื่อส่ง *_code / *_id (เช่น employee_code, department_code) ที่ไม่มีอยู่จริง ระบบจะตอบกลับทันทีเพื่อไม่ให้สิทธิ์สถานที่หลุดคืนทั้งองค์กร (fail-closed):

{ "code": "400", "message": "Failed", "errors": [ "'employee_code' not found: EMP999" ] }

Response Fields

ระดับสถานที่ (payload[])

FieldTypeDescription
location_idstringรหัสสถานที่ (แถวแรกของกลุ่มเมื่อเรียงตาม order_no)
location_group_codestringรหัสกลุ่มสถานที่
location_namestringชื่อสถานที่
location_latitudestringละติจูด
location_longitudestringลองจิจูด
location_radiusnumberรัศมีที่อนุญาตให้บันทึกเวลา (เมตร)
location_startstring | nullเวลาเริ่มต้นที่เปิดให้บันทึก
location_endstring | nullเวลาสิ้นสุดที่เปิดให้บันทึก
location_qrpathstringPath ของ QR Code สำหรับ Time Attendance App
MonSunnumberวันที่เปิดใช้งาน (1 = เปิด, 0 = ปิด)
publish_flagstringสถานะการเผยแพร่ (Y / N)
createdstring | nullวันเวลาที่ลงทะเบียนสถานที่ (YYYY-MM-DD HH:mm:ss)
order_nonumberลำดับการแสดงผลที่ตั้งไว้ในระบบ (เป็นลำดับ default ของ payload)
childarrayรายการการกำหนดสิทธิ์ของสถานที่ (Permission Scope Items)

รายการสิทธิ์ (payload[].child[])

FieldTypeDescription
location_idstringID ของแถวสิทธิ์นั้นๆ (ต่างจาก location_id ระดับกลุ่ม ยกเว้นแถวแรก)
company_idstringID บริษัท (0 = ทั้งหมด/ไม่ระบุ)
branch_idstringID สาขา (0 = ทั้งหมด/ไม่ระบุ)
department_idstringID แผนก (0 = ทั้งหมด/ไม่ระบุ)
division_idstringID ฝ่าย (0 = ทั้งหมด/ไม่ระบุ)
section_idstringID กอง (0 = ทั้งหมด/ไม่ระบุ)
section_lv01_idsection_lv05_idstringID แผนกย่อยระดับ 1–5 (0 = ทั้งหมด/ไม่ระบุ)
position_idstringID ตำแหน่งงาน (0 = ทั้งหมด/ไม่ระบุ)
employee_idstringID พนักงานรายบุคคล (0 = ทั้งหมด/ไม่ระบุ)
global_flagstringสิทธิ์แบบทั่วไป (Y / N)
auth_namestringชื่อสิทธิ์องค์กรตามลำดับ (เช่น บริษัท => ฝ่าย => แผนก)

ค่า ID ทั้งหมดใน response เป็น raw (ไม่ใช่ Base64) — นำ location_id ไปใช้กับ Submit Time Attendance ได้โดยตรง

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

FieldTypeDescription
_PAGINATION._TOTAL_RECORDSnumberจำนวนรายการทั้งหมดที่เข้าเงื่อนไข
_PAGINATION._PAGEnumberเลขหน้าปัจจุบัน
_PAGINATION._NUMBER_PER_PAGEnumberจำนวนรายการต่อหน้า (เท่ากับจำนวนรายการทั้งหมดเมื่อไม่ได้เปิดการแบ่งหน้า)

Code Examples

curl -X GET "https://openapi.humansoft.co.th/api/v1/open-apis/locations/get-list" \ -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"

สถานการณ์อื่นๆ

# สถานที่ที่พนักงานคนหนึ่งมีสิทธิ์ลงเวลา curl -X GET "https://openapi.humansoft.co.th/api/v1/open-apis/locations/get-list?employee_code=EMP001" \ -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" # ค้นหาตามชื่อ พร้อมแบ่งหน้า curl -X GET "https://openapi.humansoft.co.th/api/v1/open-apis/locations/get-list?search=อาคาร&_PAGE=1&_NUMBER_PER_PAGE=10" \ -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" # กรองผ่าน POST body curl -X POST "https://openapi.humansoft.co.th/api/v1/open-apis/locations/get-list" \ -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "department_code": "DEPT-IT", "publish_flag": "Y", "_PAGE": 1, "_NUMBER_PER_PAGE": 20 }'

Validation Rules

ParameterValidationError Message
publish_flagY หรือ N'publish_flag' must be one of: Y, N
sort_byหนึ่งในค่าที่รองรับ'sort_by' must be one of: location_name, location_id, location_group_code, created, order_no
sort_orderASC หรือ DESC (ไม่แยกตัวพิมพ์เล็ก/ใหญ่)'sort_order' must be either 'ASC' or 'DESC'
_PAGEตัวเลข ≥ 1'_PAGE' must be a positive number
_NUMBER_PER_PAGEตัวเลข 1–100'_NUMBER_PER_PAGE' must be a number between 1 and 100
searchยาวไม่เกิน 100 ตัวอักษร และห้ามมี ' " \ ;'search' parameter must not exceed 100 characters
*_codeห้ามมีอักขระ ' " \ ;'company_code' contains unsafe characters
*_idอักษรอังกฤษ ตัวเลข . _ - เท่านั้น (/^[A-Za-z0-9._-]+$/)'location_id' contains invalid characters

Notes

  • ค่าเริ่มต้นเรียงตาม order_no (น้อย → มาก) และตัดสินด้วย location_id เมื่อค่าเท่ากัน ทำให้ลำดับคงที่ทุกครั้ง (จำเป็นต่อความถูกต้องของการแบ่งหน้า)
  • sort_by=location_name เรียงตามลำดับพจนานุกรมไทย
  • หาก _PAGE เกินจำนวนหน้าที่มีอยู่จริง จะได้ HTTP 200 พร้อม payload ว่าง โดย _PAGINATION._TOTAL_RECORDS ยังคืนค่าจริง
  • รายการใน payload ถูกจัดกลุ่มตาม location_group_code โดยสิทธิ์ย่อยขององค์กรถูกรวมไว้ใน child[] — ค่าระดับสถานที่ (ชื่อ, พิกัด, MonSun, publish_flag) มาจากแถวแรกของกลุ่ม
  • ฟิลด์ location_start, location_end, created อาจเป็น null ถ้ายังไม่ได้กำหนดค่า
  • Submit Time Attendance - บันทึกเวลาโดยอ้างอิง location_id ที่ได้จาก API นี้
  • Get Device List - อุปกรณ์บันทึกเวลาที่ผูกกับสถานที่
Last updated on