{"info":{"_postman_id":"d5d3846a-ed0d-48e2-aac0-8d55bfe1dfab","name":"UNAI API V1.1","description":"<html><head></head><body><h1 id=\"unai-api-v11\">UNAI API V1.1</h1>\n<p>Current Postman collection for authentication, master data, device data, staff administration, socket topics, gateway status, and location-history operations. Use <code>https://rtls.lailab.online</code> as the server base URL. Except for <code>/auth/gen_token</code>, requests that access protected resources require a valid bearer token and the permission stated in each request description.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"UNAI API V1.1","slug":"unai-api-v11"}],"owner":"586765","collectionId":"d5d3846a-ed0d-48e2-aac0-8d55bfe1dfab","publishedId":"2sBY4PR1o6","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-07-22T04:13:38.000Z"},"item":[{"name":"authenticate","item":[{"name":"gen new token with username/password","event":[{"listen":"test","script":{"type":"text/javascript","exec":["const jsonData = pm.response.json();","if (jsonData && jsonData.access_token) {","    pm.environment.set(\"API_ACCESS_TOKEN\", jsonData.access_token);","    pm.collectionVariables.set(\"API_ACCESS_TOKEN\", jsonData.access_token);","    console.log(\"API_ACCESS_TOKEN saved\");","}","if (jsonData && jsonData.socket_token) {","    pm.environment.set(\"API_SOCKET_TOKEN\", jsonData.socket_token);","    pm.collectionVariables.set(\"API_SOCKET_TOKEN\", jsonData.socket_token);","    console.log(\"API_SOCKET_TOKEN saved\");","}","if (jsonData && jsonData.refresh_token) {","    pm.environment.set(\"REFRESH_TOKEN\", jsonData.refresh_token);","    pm.collectionVariables.set(\"REFRESH_TOKEN\", jsonData.refresh_token);","    console.log(\"REFRESH_TOKEN saved\");","}"],"id":"9bfdba79-9805-4d23-a698-3b20336af0e8"}}],"id":"f7b8f48f-6fa6-4ddd-878a-6b96b5fef451","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"username","value":"{{USERNAME}}","description":"<p>USERNAME</p>\n","type":"text"},{"key":"password","value":"{{PASSWORD}}","description":"<p>PASSWORD</p>\n","type":"text"},{"key":"token_expire_time_in_minute","value":"60","type":"text","disabled":true},{"key":"refresh_token_expire_time_in_minute","value":"60","type":"text","disabled":true},{"key":"socket_token_type","value":"rs256","type":"text","uuid":"0ae14fcf-d14b-4f2f-bfef-9d763d819cb7"},{"key":"client_app","value":"drtls_manager","description":"<p>Optional. Use drtls_manager to restrict login to SuperAdmin/SI.</p>\n","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/auth/gen_token","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Authenticates a staff account with <code>username</code> and <code>password</code>, then returns a signed access token, refresh token, socket token, session and staff metadata, and the resolved access scope. Optional expiry fields are bounded by the server configuration.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>No bearer token is required. <code>username</code> and <code>password</code> are required.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>username</code>, <code>password</code>, <code>token_expire_time_in_minute</code>, <code>refresh_token_expire_time_in_minute</code>, <code>socket_token_type</code>, <code>client_app</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["auth","gen_token"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"f7b8f48f-6fa6-4ddd-878a-6b96b5fef451"},{"name":"gen new token with refreshtoken","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"7ba215eb-2589-439a-97ff-2716cb4b99c8"}}],"id":"a55ffef3-3f5a-4fdb-9529-59c979f0dd28","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"url":"https://rtls.lailab.online/auth/refresh_token","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Rotates a valid bearer refresh token and returns a new token pair for the same active session. The supplied refresh token must be valid and must match an active or supported legacy session.</p>\n<h3 id=\"authentication\">Authentication</h3>\n<p>Send the refresh token as a bearer token.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["auth","refresh_token"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"a55ffef3-3f5a-4fdb-9529-59c979f0dd28"}],"id":"bf93e5a3-8662-4a69-8c35-267e8e015651","description":"<p>Issues and rotates access and refresh tokens for API authentication.</p>\n","_postman_id":"bf93e5a3-8662-4a69-8c35-267e8e015651"},{"name":"socket","item":[{"name":"gen socket topic","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"313ca983-fa53-4808-b870-949547f91393"}}],"id":"ef0643c7-f627-4578-a5b5-94bd0c44f75b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"floorID","value":"[Floor ID]","description":"<p>Floor ID</p>\n","type":"text"}]},"url":"https://rtls.lailab.online/gen_encrypt_topic","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Generates encrypted Socket.IO topic data for one floor ID or an array of floor IDs supplied in <code>floorID</code>. Every requested floor must be accessible to the authenticated staff account.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and authenticated staff access.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>floorID</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["gen_encrypt_topic"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"ef0643c7-f627-4578-a5b5-94bd0c44f75b"},{"name":"get socket topic by tagid","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"08f95764-4f79-4604-81b3-be1c21ff1935"}}],"id":"77d2d8ff-479f-49bf-81a2-69adf84581a9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"tagID","value":"[tag ID]","description":"<p>tag ID</p>\n","type":"text"}]},"url":"https://rtls.lailab.online/api/v1/gen_tag_encrypt_topic_socket","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Generates encrypted Socket.IO topic data for the requested tag within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_device_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>tagID</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","gen_tag_encrypt_topic_socket"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"77d2d8ff-479f-49bf-81a2-69adf84581a9"}],"id":"769d752f-4f94-4eb2-b9e0-d850bb4b9c97","description":"<p>Generates encrypted Socket.IO topics and socket credentials for floors or tags within the authenticated staff access scope.</p>\n","_postman_id":"769d752f-4f94-4eb2-b9e0-d850bb4b9c97"},{"name":"place","item":[{"name":"get all place","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"186c9adb-7a88-4978-a99b-218344d97097"}}],"id":"b0efbf86-bf56-4b53-aee1-571a096a0053","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_place","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all place within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_place"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"b0efbf86-bf56-4b53-aee1-571a096a0053"},{"name":"get place by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"76825443-e45b-4a5a-82db-472880417da9"}}],"id":"d8c2e1b6-e5f8-4e42-b263-2ba93389dc71","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_place_by_id/[place_id]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns place by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>place_id</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_place_by_id","[place_id]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"d8c2e1b6-e5f8-4e42-b263-2ba93389dc71"},{"name":"get place device access","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"82f23c4f-89a5-4b5f-84ba-19ee0426e155"}}],"id":"ee956115-400b-452c-9f7e-00535dc1622a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/place_device_access","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns place device access within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_place_device_access</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","place_device_access"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"ee956115-400b-452c-9f7e-00535dc1622a"},{"name":"get place device access by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"94e9acb1-5a1b-4500-b0f7-f9607cd69a62"}}],"id":"e20e1259-4661-4cbe-86ef-267cf52f22f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/place_device_access/[place_id]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns place device access by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_place_device_access</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>place_id</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","place_device_access","[place_id]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"e20e1259-4661-4cbe-86ef-267cf52f22f0"}],"id":"ac236e18-dae0-45e7-952b-24a2ed0dd37e","description":"<p>Reads places and place-level device-access assignments visible to the authenticated staff account.</p>\n","_postman_id":"ac236e18-dae0-45e7-952b-24a2ed0dd37e"},{"name":"gateway","item":[{"name":"get gateway runtime status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"b8d9bba0-368c-42d4-8da8-53fa0d745ee3"}}],"id":"c2a217e5-c8c3-450d-8696-7157b746e855","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_gateway_runtime_status","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the latest runtime/connectivity status for gateways visible to the authenticated staff account.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_gateway_runtime_status</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_gateway_runtime_status"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"c2a217e5-c8c3-450d-8696-7157b746e855"}],"id":"1522b8e6-f89f-414c-bb11-a37a09b9356c","description":"<p>Reads the current runtime status of gateways visible to the authenticated staff account.</p>\n","_postman_id":"1522b8e6-f89f-414c-bb11-a37a09b9356c"},{"name":"building","item":[{"name":"get all building by staff","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"c720fd37-3823-4797-a934-172abed10ce9"}}],"id":"b4f596a6-c58b-4cf8-8522-3f759463b039","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_building","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all building by staff within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_building"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"b4f596a6-c58b-4cf8-8522-3f759463b039"},{"name":"get building by place id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"090bd792-c00e-4f45-9028-504435c81de6"}}],"id":"9734d3cd-1ad2-4b36-855b-405da01a8a8c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_building_by_place_id/[PLACE_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns building by place id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>PLACE_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_building_by_place_id","[PLACE_ID]"],"host":["https://rtls.lailab.online"],"query":[{"disabled":true,"key":null,"value":""}],"variable":[]}},"response":[],"_postman_id":"9734d3cd-1ad2-4b36-855b-405da01a8a8c"},{"name":"get building by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"77420851-8318-407f-991e-5df61b5cfdba"}}],"id":"67c2ce8f-35f8-48a4-aa2e-d43aa8768104","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_building_by_id/[BUILDING_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns building by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>BUILDING_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_building_by_id","[BUILDING_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"67c2ce8f-35f8-48a4-aa2e-d43aa8768104"}],"id":"0a56f086-4db1-45e6-b6b4-042d40ebf552","description":"<p>Reads buildings visible to the authenticated staff account, optionally scoped by place or building ID.</p>\n","_postman_id":"0a56f086-4db1-45e6-b6b4-042d40ebf552"},{"name":"floor","item":[{"name":"get all floor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"c8ca2124-3a22-45f7-8c10-b4e6a3020713"}}],"id":"3f651c56-ce47-4773-a6d8-0ad3011e6ac0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_floor","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all floor within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_floor"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"3f651c56-ce47-4773-a6d8-0ad3011e6ac0"},{"name":"get floor by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"c2e9f729-9c5e-416c-a79a-6a708ad2e695"}}],"id":"a09e3a88-0705-40ad-abec-e159009ffc53","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_floor_by_id/[FLOOR_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns floor by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>FLOOR_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_floor_by_id","[FLOOR_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"a09e3a88-0705-40ad-abec-e159009ffc53"},{"name":"get floor by building id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"3f4096a6-5309-4341-8fe3-b9f2e56cbf9c"}}],"id":"d9ae35ba-5986-47cb-9e8b-c9694c82d8e0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_floors_by_building_id/[BUILDING_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns floor by building id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>BUILDING_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_floors_by_building_id","[BUILDING_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"d9ae35ba-5986-47cb-9e8b-c9694c82d8e0"}],"id":"9c031460-9c48-4573-a0f5-b8273f96c5e5","description":"<p>Reads floors visible to the authenticated staff account, optionally scoped by building or floor ID.</p>\n","_postman_id":"9c031460-9c48-4573-a0f5-b8273f96c5e5"},{"name":"group user","item":[{"name":"get all group user","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"fee8b71c-f0ee-41bd-a16a-b33c51cc77cf"}}],"id":"af00fd4c-741b-4a25-bfb0-42dc0b0d6cb8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_group_user","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all group user within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_group_user"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"af00fd4c-741b-4a25-bfb0-42dc0b0d6cb8"}],"id":"130b9d7f-3dc5-4c3c-b8f4-a4332e74930f","description":"<p>Reads the user groups available within the authenticated staff access scope.</p>\n","_postman_id":"130b9d7f-3dc5-4c3c-b8f4-a4332e74930f"},{"name":"staff","item":[{"name":"get staff roles","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"cb00107c-19f2-438b-808a-90b71713f2e2"}}],"id":"ce550f08-b742-4809-88a3-f527da88d246","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_staff_roles","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns staff roles within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_staff_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_staff_roles"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"ce550f08-b742-4809-88a3-f527da88d246"},{"name":"get all staff","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"f81b1ebd-df48-499f-bab3-de43a5108141"}}],"id":"a8a41bce-a348-49f9-8693-553d379984f5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_staff","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all staff within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_staff_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_staff"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"a8a41bce-a348-49f9-8693-553d379984f5"},{"name":"get staff by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"a5245689-7751-403d-b2a8-fb562b372d28"}}],"id":"ba396683-ade5-4fc4-977e-a137dd38af05","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_staff_by_id/1","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns staff by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_staff_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>STAFF_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_staff_by_id","1"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"ba396683-ade5-4fc4-977e-a137dd38af05"},{"name":"insert staff","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"c7327dfa-76dd-43d1-b69e-26e04a4e5dad"}}],"id":"92a2081f-0c99-4a2b-aabf-bd5f37a778f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n  \"username\": \"new_staff\",\n  \"password\": \"password123\",\n  \"first_name\": \"First\",\n  \"last_name\": \"Last\",\n  \"email\": \"staff@example.com\",\n  \"line_notify_token\": \"\",\n  \"notification_status\": 1,\n  \"staff_role_id\": 1,\n  \"is_able_to_design_floor\": 0,\n  \"building_ids\": [\n    1\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://rtls.lailab.online/api/v1/insert_staff","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Creates a staff account using the supplied identity, role, credential, and access-scope fields.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_staff_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>username</code>, <code>password</code>, <code>first_name</code>, <code>last_name</code>, <code>email</code>, <code>line_notify_token</code>, <code>notification_status</code>, <code>staff_role_id</code>, <code>is_able_to_design_floor</code>, <code>building_ids</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","insert_staff"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"92a2081f-0c99-4a2b-aabf-bd5f37a778f2"},{"name":"update staff","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"29317ccc-a01c-458d-9fc3-d267f8c2d0c2"}}],"id":"4713dc15-f79c-4db6-9870-9b3804c0703b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"PATCH","header":[],"body":{"mode":"raw","raw":"{\n  \"username\": \"updated_staff\",\n  \"first_name\": \"First\",\n  \"last_name\": \"Last\",\n  \"email\": \"staff@example.com\",\n  \"line_notify_token\": \"\",\n  \"notification_status\": 1,\n  \"staff_role_id\": 1,\n  \"is_able_to_design_floor\": 0,\n  \"building_ids\": [\n    1\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"https://rtls.lailab.online/api/v1/update_staff/1","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Updates the supplied fields of the staff account identified by <code>STAFF_ID</code>.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_staff_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>STAFF_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>username</code>, <code>first_name</code>, <code>last_name</code>, <code>email</code>, <code>line_notify_token</code>, <code>notification_status</code>, <code>staff_role_id</code>, <code>is_able_to_design_floor</code>, <code>building_ids</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","update_staff","1"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"4713dc15-f79c-4db6-9870-9b3804c0703b"},{"name":"remove staff","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"c4efc108-ae01-42f4-b6a6-033b8fe32ff3"}}],"id":"e2dd41ef-4ac4-4226-a62a-e92a1407e4bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"DELETE","header":[],"url":"https://rtls.lailab.online/api/v1/remove_staff/1","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Removes or deactivates the staff account identified by <code>STAFF_ID</code> according to the current staff-management policy.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_staff_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>STAFF_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","remove_staff","1"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"e2dd41ef-4ac4-4226-a62a-e92a1407e4bd"}],"id":"e1a2462e-fd0b-41aa-b098-00d64bef5be4","description":"<p>Reads and manages staff accounts and staff roles. Management operations require staff-management permission.</p>\n","_postman_id":"e1a2462e-fd0b-41aa-b098-00d64bef5be4"},{"name":"user","item":[{"name":"get all user","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"5a83a4b2-29a6-4184-834d-5f3c5d6c637a"}}],"id":"e517b649-c0df-4707-986b-175132ea3d4b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_user","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all user within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_user"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"e517b649-c0df-4707-986b-175132ea3d4b"},{"name":"get user by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"8763c923-3fe3-41f9-880a-a4d0de766acc"}}],"id":"9179a1af-2e8b-4d00-be02-da949d94d454","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_user_by_id/[USER_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns user by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>USER_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_user_by_id","[USER_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"9179a1af-2e8b-4d00-be02-da949d94d454"},{"name":"update user info","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"77c075e7-e1b9-45e0-a37e-7cadbc59acfe"}}],"id":"cc1ef7bd-d7c8-418a-8e2f-ab9957a95a0b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"PATCH","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"first_name","value":"","type":"text"},{"key":"last_name","value":"","type":"text"},{"key":"image","value":"","type":"text"},{"key":"nick_name","value":"","type":"text","disabled":true},{"key":"gender","value":"","type":"text","disabled":true},{"key":"email","value":"","type":"text","disabled":true},{"key":"birthday","value":"","type":"text","disabled":true},{"key":"tag_id","value":"","type":"text","disabled":true},{"key":"init_floor","value":"","type":"text","disabled":true},{"key":"last_floor","value":"","type":"text","disabled":true},{"key":"group_user","value":"","type":"text","disabled":true},{"key":"status","value":"","type":"text","disabled":true},{"key":"alt_status","value":"","type":"text","disabled":true},{"key":"avatar","value":"","type":"text","disabled":true},{"key":"notification_level","value":"","type":"text","disabled":true},{"key":"created_by","value":"","type":"text","disabled":true},{"key":"updated_by","value":"","type":"text","disabled":true},{"key":"already_registered_nt_racing","value":"","type":"text","disabled":true},{"key":"nstda_id","value":"","type":"text","disabled":true},{"key":"action_status","value":"","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/api/v1/update_user_info/[USER_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Updates only the supplied fields of the user identified by <code>USER_ID</code>. The user must be accessible to the authenticated staff account; update audit data is applied by the server.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_device_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>USER_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>first_name</code>, <code>last_name</code>, <code>image</code>, <code>nick_name</code>, <code>gender</code>, <code>email</code>, <code>birthday</code>, <code>tag_id</code>, <code>init_floor</code>, <code>last_floor</code>, <code>group_user</code>, <code>status</code>, <code>alt_status</code>, <code>avatar</code>, <code>notification_level</code>, <code>created_by</code>, <code>updated_by</code>, <code>already_registered_nt_racing</code>, <code>nstda_id</code>, <code>action_status</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","update_user_info","[USER_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"cc1ef7bd-d7c8-418a-8e2f-ab9957a95a0b"},{"name":"Insert user","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"fec19c4c-8e49-4ad2-b3e8-ace90a8da003"}}],"id":"c940d44a-4012-41d1-9f21-d2107fc63b68","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"first_name","value":"","type":"text","disabled":true},{"key":"last_name","value":"","type":"text","disabled":true},{"key":"nick_name","value":"","type":"text","disabled":true},{"key":"gender","value":"","type":"text","disabled":true},{"key":"email","value":"","type":"text","disabled":true},{"key":"birthday","value":"","type":"text","disabled":true},{"key":"tag_id","value":"","type":"text","disabled":true},{"key":"init_floor","value":"","type":"text","disabled":true},{"key":"last_floor","value":"","type":"text","disabled":true},{"key":"group_user","value":"","type":"text","disabled":true},{"key":"status","value":"","type":"text","disabled":true},{"key":"alt_status","value":"","type":"text","disabled":true},{"key":"avatar","value":"","type":"text","disabled":true},{"key":"notification_level","value":"","type":"text","disabled":true},{"key":"image","value":"","type":"text","disabled":true},{"key":"created_by","value":"","type":"text","disabled":true},{"key":"updated_by","value":"","type":"text","disabled":true},{"key":"created_at","value":"","type":"text","disabled":true},{"key":"updated_at","value":"","type":"text","disabled":true},{"key":"snap_to_line_enable","value":"","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/api/v1/insert_user","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Creates a tracked-user profile. <code>tag_id</code> is required and must not already be assigned to another user; omitted audit IDs and timestamps are populated by the server.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_device_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>first_name</code>, <code>last_name</code>, <code>nick_name</code>, <code>gender</code>, <code>email</code>, <code>birthday</code>, <code>tag_id</code>, <code>init_floor</code>, <code>last_floor</code>, <code>group_user</code>, <code>status</code>, <code>alt_status</code>, <code>avatar</code>, <code>notification_level</code>, <code>image</code>, <code>created_by</code>, <code>updated_by</code>, <code>created_at</code>, <code>updated_at</code>, <code>snap_to_line_enable</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","insert_user"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"c940d44a-4012-41d1-9f21-d2107fc63b68"}],"id":"321c36c7-2eb2-42ef-8a35-a93ad11fbad2","description":"<p>Reads and manages tracked-user profiles within the authenticated staff access scope.</p>\n","_postman_id":"321c36c7-2eb2-42ef-8a35-a93ad11fbad2"},{"name":"tag","item":[{"name":"get all tag","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"39ddd03f-6480-4854-bbbe-8b8a6f51f66f"}}],"id":"f2e995a8-53a6-4f92-ab77-2b13b6c74ed6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_tag","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all tag within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_tag"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"f2e995a8-53a6-4f92-ab77-2b13b6c74ed6"},{"name":"get tag and sensor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"0da294f0-5cec-4383-9bcd-4ce25ab1e3b7"}}],"id":"7e536371-7a1a-4b94-8f26-580cef8e7c2b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_tag_and_sensor","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns tag and sensor within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_tag_and_sensor"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"7e536371-7a1a-4b94-8f26-580cef8e7c2b"},{"name":"get tag by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"2d07634c-ddff-4f29-8f84-135823ff3141"}}],"id":"93b1ce85-444e-4bdb-9656-82f867b83d90","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_tag_by_id/[TAG_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns tag by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>TAG_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_tag_by_id","[TAG_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"93b1ce85-444e-4bdb-9656-82f867b83d90"},{"name":"insert tag","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"e468298c-4161-4029-81dc-71e24fd6c46f"}}],"id":"3aaf2593-8069-4b1b-8520-3c0a144aafa8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"tag_id","value":"","type":"text","disabled":true},{"key":"label","value":"","type":"text","disabled":true},{"key":"ui_display","value":"","type":"text","disabled":true},{"key":"major","value":"","type":"text","disabled":true},{"key":"minor","value":"","type":"text","disabled":true},{"key":"uuid","value":"","type":"text","disabled":true},{"key":"manufacturer","value":"","type":"text","disabled":true},{"key":"volt_battery","value":"","type":"text","disabled":true},{"key":"firmware_version","value":"","type":"text","disabled":true},{"key":"mac_address","value":"","type":"text","disabled":true},{"key":"blink_period","value":"","type":"text","disabled":true},{"key":"tx_ant_delay","value":"","type":"text","disabled":true},{"key":"rx_ant_delay","value":"","type":"text","disabled":true},{"key":"date_time","value":"","type":"text","disabled":true},{"key":"device_type_id","value":"","type":"text","disabled":true},{"key":"x","value":"","type":"text","disabled":true},{"key":"y","value":"","type":"text","disabled":true},{"key":"z","value":"","type":"text","disabled":true},{"key":"tagcol","value":"","type":"text","disabled":true},{"key":"device_id_thingsboard","value":"","type":"text","disabled":true},{"key":"device_access_token_thingsboard","value":"","type":"text","disabled":true},{"key":"disable","value":"","type":"text","disabled":true},{"key":"path_id","value":"","type":"text","disabled":true},{"key":"visitor_id","value":"","type":"text","disabled":true},{"key":"status","value":"","type":"text","disabled":true},{"key":"created_by","value":"","type":"text","disabled":true},{"key":"updated_by","value":"","type":"text","disabled":true},{"key":"created_at","value":"","type":"text","disabled":true},{"key":"updated_at","value":"","type":"text","disabled":true},{"key":"method_id","value":"","type":"text","disabled":true},{"key":"serial_number","value":"","type":"text","disabled":true},{"key":"paired_with_id","value":"","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/api/v1/insert_tag","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Creates a tag record from the supplied tag/device fields within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_manage_device_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>tag_id</code>, <code>label</code>, <code>ui_display</code>, <code>major</code>, <code>minor</code>, <code>uuid</code>, <code>manufacturer</code>, <code>volt_battery</code>, <code>firmware_version</code>, <code>mac_address</code>, <code>blink_period</code>, <code>tx_ant_delay</code>, <code>rx_ant_delay</code>, <code>date_time</code>, <code>device_type_id</code>, <code>x</code>, <code>y</code>, <code>z</code>, <code>tagcol</code>, <code>device_id_thingsboard</code>, <code>device_access_token_thingsboard</code>, <code>disable</code>, <code>path_id</code>, <code>visitor_id</code>, <code>status</code>, <code>created_by</code>, <code>updated_by</code>, <code>created_at</code>, <code>updated_at</code>, <code>method_id</code>, <code>serial_number</code>, <code>paired_with_id</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","insert_tag"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"3aaf2593-8069-4b1b-8520-3c0a144aafa8"},{"name":"get_tag_and_sensor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"eeaf242a-632c-4df7-9f4e-f2325de53570"}}],"id":"7066a53d-aa89-4dfe-ae11-540ac627f976","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_sensor_and_tag_data","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns tag and sensor within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_sensor_and_tag_data"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"7066a53d-aa89-4dfe-ae11-540ac627f976"}],"id":"4acb784f-27fb-4264-b19a-d3c2a408593d","description":"<p>Reads tag and sensor metadata and creates tags within the authenticated staff access scope.</p>\n","_postman_id":"4acb784f-27fb-4264-b19a-d3c2a408593d"},{"name":"anchor","item":[{"name":"get anchor by floor id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"b228ec21-8c52-4d1d-813f-2aba89c582e1"}}],"id":"3c0df025-0de4-43ef-8e39-3877e78e25bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_anchor_by_floor_id/[FLOOR_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns anchor by floor id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>FLOOR_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_anchor_by_floor_id","[FLOOR_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"3c0df025-0de4-43ef-8e39-3877e78e25bd"},{"name":"get all anchor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"12f4ef2b-559a-4db5-b93c-58ff6fc2c36a"}}],"id":"e60c1f60-a0e7-4bd0-a98b-2f30985ad6c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_anchor","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns all anchor within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_anchor"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"e60c1f60-a0e7-4bd0-a98b-2f30985ad6c1"},{"name":"get anchor by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"7e7170ac-c115-4f62-b4da-a60319a00e4c"}}],"id":"96e7c5c8-45b8-4dbc-8333-ad24e27bbbf1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_anchor_by_id/[ANCHOR_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns anchor by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>ANCHOR_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_anchor_by_id","[ANCHOR_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"96e7c5c8-45b8-4dbc-8333-ad24e27bbbf1"}],"id":"16d42482-43c1-4ed1-80db-5682c14227cb","description":"<p>Reads anchor metadata within the authenticated staff access scope.</p>\n","_postman_id":"16d42482-43c1-4ed1-80db-5682c14227cb"},{"name":"zone","item":[{"name":"get all zone","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"168e62f9-dd60-4457-b219-f051aa868db0"}}],"id":"0706c085-f020-48c1-9d69-dd73409f4719","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_all_zone","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns every zone visible to the authenticated staff account, including floor, building, and place metadata. SuperAdmin receives all zones; other roles receive zones only from assigned buildings.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns a JSON array. Invalid or expired authentication, insufficient permission, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_zone"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"0706c085-f020-48c1-9d69-dd73409f4719"},{"name":"get zone by floor id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"68467db5-ebf7-4501-92d2-600e28be0d19"}}],"id":"49b61474-fbc2-4170-91e3-08039d153ebc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_zone_by_floor_id/[FLOOR_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns zone by floor id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>FLOOR_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_zone_by_floor_id","[FLOOR_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"49b61474-fbc2-4170-91e3-08039d153ebc"},{"name":"get shelf zone","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"cfcade79-8b47-4320-8e99-b26b5401068f"}}],"id":"09b360d5-7566-4dcd-a734-6256537948c3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_shelf_zone","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns shelf zone within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_shelf_zone"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"09b360d5-7566-4dcd-a734-6256537948c3"},{"name":"get zone by id","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"5c25b342-204d-4647-a336-3c92ec8af421"}}],"id":"4ea7b1cd-10e4-4044-97e7-b0eb8406ea14","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"GET","header":[],"url":"https://rtls.lailab.online/api/v1/get_zone_by_zone_id/[ZONE_ID]","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns zone by id within the authenticated staff access scope.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_master_data</code>.</p>\n<h3 id=\"path-parameters\">Path parameters</h3>\n<ul>\n<li><code>ZONE_ID</code>: Required resource identifier.</li>\n</ul>\n<h3 id=\"request-body\">Request body</h3>\n<p>No request body is required.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_zone_by_zone_id","[ZONE_ID]"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"4ea7b1cd-10e4-4044-97e7-b0eb8406ea14"}],"id":"12101ec2-42f9-4fdb-8c29-be904a0ae5e8","description":"<p>Reads floor zones and shelf-zone metadata within the authenticated staff access scope.</p>\n","_postman_id":"12101ec2-42f9-4fdb-8c29-be904a0ae5e8"},{"name":"location history","item":[{"name":"last location by floor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"b755a96f-afbe-4e49-925d-c365fa7004f7"}}],"id":"8b7db293-3d8a-46b1-a6f7-ea4b53166367","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"floor_id","value":"[floor_id]","description":"<p>[floor_id]</p>\n","type":"text"}]},"url":"https://rtls.lailab.online/api/v1/get_last_location_by_floor_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the last known tag locations on the requested <code>floor_id</code>.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>floor_id</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_last_location_by_floor_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"8b7db293-3d8a-46b1-a6f7-ea4b53166367"},{"name":"last location by tag","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"893da203-e195-4a9b-b8fb-1cc077e7effc"}}],"id":"d3405f8a-a7e4-477f-a352-c895591ea785","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"tag_id","value":"[tag_id]","type":"text"}]},"url":"https://rtls.lailab.online/api/v1/get_last_location_by_tag_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the last known location for <code>tag_id</code>. If <code>tag_id</code> is omitted, returns last-location records for all tags accessible to the authenticated staff account.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>tag_id</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_last_location_by_tag_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"d3405f8a-a7e4-477f-a352-c895591ea785"},{"name":"get all tag last location","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"0f9a274b-826f-44cf-9091-c0f702c70c6e"}}],"id":"38b9aae9-ceb0-4a9d-9fd8-797eaa41e7ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[]},"url":"https://rtls.lailab.online/api/v1/get_all_tag_last_location","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the last known location of every tag accessible to the authenticated staff account.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>Send the request using the body format configured in this collection.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_all_tag_last_location"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"38b9aae9-ceb0-4a9d-9fd8-797eaa41e7ab"},{"name":"last location by zone","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"651cbc49-7c6f-4e32-b9d1-a0854c16faa7"}}],"id":"4f3ce6a3-f50c-47c7-9bfd-c4a04d5f374f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"zone_id","value":"[ZONE_ID]","description":"<p>ZONE_ID</p>\n","type":"text"}]},"url":"https://rtls.lailab.online/api/v1/get_last_location_by_zone_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the last known tag locations in the requested <code>zone_id</code>.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>zone_id</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_last_location_by_zone_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"4f3ce6a3-f50c-47c7-9bfd-c4a04d5f374f"},{"name":"get location by tag","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"515c1a2e-d377-4fad-aa86-1a038f77b5df"}}],"id":"ad675d78-dff9-47a1-9bcd-43d301667087","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"tag_id","value":"[tag_id]","description":"<p>TAG_ID</p>\n","type":"text"},{"key":"start_timestamp","value":"[start unitx timestamp in second]","description":"<p>start unitx timestamp in second</p>\n","type":"text"},{"key":"end_timestamp","value":"[end unitx timestamp in second]","description":"<p>end unitx timestamp in second</p>\n","type":"text"},{"key":"mode","value":"page","description":"<p>Optional. Set to page to enable cursor pagination. Leave disabled or omit for legacy full-response behavior.</p>\n","type":"text","disabled":true},{"key":"page_size","value":"auto","description":"<p>Optional. Use auto or a positive number. Numeric page_size skips count unless include_total=true.</p>\n","type":"text","disabled":true},{"key":"include_total","value":"true","description":"<p>Optional. Set true to include total_count. Requires a count preflight on the first page.</p>\n","type":"text","disabled":true},{"key":"cursor","value":"[next_cursor]","description":"<p>Optional. Use next_cursor from the previous page. Must match the same ID and time range.</p>\n","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/api/v1/get_location_by_tag_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns location history for <code>tag_id</code> between <code>start_timestamp</code> and <code>end_timestamp</code>. Set <code>mode</code> to <code>page</code> to use cursor pagination; path-simplification options may also be supplied.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>tag_id</code>, <code>start_timestamp</code>, <code>end_timestamp</code>, <code>mode</code>, <code>page_size</code>, <code>include_total</code>, <code>cursor</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_location_by_tag_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"ad675d78-dff9-47a1-9bcd-43d301667087"},{"name":"get location by floor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"335ed0a6-bcf8-41ce-8acd-a0d2f12d95cc"}}],"id":"fdafcc3f-8a7f-4d23-8240-f625f175cb46","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"floor_id","value":"[floor_id]","type":"text"},{"key":"start_timestamp","value":"[start unitx timestamp in second]","description":"<p>[start unitx timestamp in second]</p>\n","type":"text"},{"key":"end_timestamp","value":"[end unitx timestamp in second]","description":"<p>[end unitx timestamp in second]</p>\n","type":"text"},{"key":"mode","value":"page","description":"<p>Optional. Set to page to enable cursor pagination. Leave disabled or omit for legacy full-response behavior.</p>\n","type":"text","disabled":true},{"key":"page_size","value":"auto","description":"<p>Optional. Use auto or a positive number. Numeric page_size skips count unless include_total=true.</p>\n","type":"text","disabled":true},{"key":"include_total","value":"true","description":"<p>Optional. Set true to include total_count. Requires a count preflight on the first page.</p>\n","type":"text","disabled":true},{"key":"cursor","value":"[next_cursor]","description":"<p>Optional. Use next_cursor from the previous page. Must match the same ID and time range.</p>\n","type":"text","disabled":true}]},"url":"https://rtls.lailab.online/api/v1/get_location_by_floor_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns location history for <code>floor_id</code> between <code>start_timestamp</code> and <code>end_timestamp</code>. Set <code>mode</code> to <code>page</code> to use cursor pagination; path-simplification options may also be supplied.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>floor_id</code>, <code>start_timestamp</code>, <code>end_timestamp</code>, <code>mode</code>, <code>page_size</code>, <code>include_total</code>, <code>cursor</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_location_by_floor_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"fdafcc3f-8a7f-4d23-8240-f625f175cb46"},{"name":"get tag timeline by floor","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["const apiAccessToken = pm.environment.get('API_ACCESS_TOKEN') || pm.collectionVariables.get('API_ACCESS_TOKEN');","","if (!apiAccessToken) {","    throw new Error('API_ACCESS_TOKEN is not set. Run /auth/gen_token first.');","}","","pm.request.headers.upsert({","    key: 'Authorization',","    value: `Bearer ${apiAccessToken}`","});"],"id":"cc7bb81b-6c22-4862-b43b-faa3568809a4"}}],"id":"5000d078-3a01-49ea-8eb7-3c4381a09b61","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"urlencoded","urlencoded":[{"key":"floor_id","value":"[floor_id]","type":"text"},{"key":"start_timestamp","value":"[start unitx timestamp in second]","description":"<p>[start unitx timestamp in second]</p>\n","type":"text"},{"key":"end_timestamp","value":"[end unitx timestamp in second]","description":"<p>[end unitx timestamp in second]</p>\n","type":"text"}]},"url":"https://rtls.lailab.online/api/v1/get_tag_timeline_by_floor_id","description":"<h3 id=\"purpose\">Purpose</h3>\n<p>Returns the tag timeline for <code>floor_id</code> between <code>start_timestamp</code> and <code>end_timestamp</code>.</p>\n<h3 id=\"authorization\">Authorization</h3>\n<p>Requires a valid bearer access token and <code>api_read_location_history</code>.</p>\n<h3 id=\"request-body\">Request body</h3>\n<p>The collection provides these fields: <code>floor_id</code>, <code>start_timestamp</code>, <code>end_timestamp</code>. Fields marked disabled in Postman are optional examples unless the purpose section states otherwise.</p>\n<h3 id=\"response\">Response</h3>\n<p>Returns JSON data for a successful request. Invalid input, an expired or invalid token, insufficient permission, an inaccessible resource, or an internal error returns the corresponding non-2xx HTTP status.</p>\n","urlObject":{"path":["api","v1","get_tag_timeline_by_floor_id"],"host":["https://rtls.lailab.online"],"query":[],"variable":[]}},"response":[],"_postman_id":"5000d078-3a01-49ea-8eb7-3c4381a09b61"}],"id":"90325e0e-7019-4967-977f-2140aff6bd43","description":"<p>Reads current and historical tag locations. These operations are limited to floors, zones, and tags accessible to the authenticated staff account.</p>\n","_postman_id":"90325e0e-7019-4967-977f-2140aff6bd43"}],"variable":[{"key":"URL","value":"https://rtls.lailab.online"},{"key":"ACCESS_TOKEN","value":""},{"key":"REFRESH_TOKEN","value":""},{"key":"API_KEY","value":""},{"key":"STAFF_ID","value":"1"},{"key":"SESSION_COOKIE","value":"","description":"Express session cookie value for internal browser/session APIs, for example connect.sid=..."},{"key":"auth_secret_07d4"},{"key":"API_ACCESS_TOKEN","value":"","description":"Bearer token saved by /auth/gen_token and used by protected API requests."},{"key":"API_SOCKET_TOKEN","value":"","description":"Socket token saved by /auth/gen_token."}]}