generated: '2026-08-02' method: derived source: https://github.com/zainar/locate-latency-measurement-script spec_type: none note: 'ZaiNar publishes NO AsyncAPI document and NO public webhook or event documentation. This file is an honest CATALOG of the real-time event surface as implemented by ZaiNar''s own open-source client — it is deliberately NOT an AsyncAPI specification, because authoring one on the provider''s behalf would assert a machine-readable contract ZaiNar does not publish. For the same reason no AsyncAPI or Webhooks pointer is wired in apis.yml; the surface is catalogued under the descriptive StreamingEndpoint type instead. Upgrade this file to a verbatim spec if ZaiNar ever publishes one.' publicly_documented: false credential_gated: true transports: - name: WiFi-Cloud protocol: websocket url_template: wss://{api-host}/pipeline/ws/updates/v2/sites/{site_id} hosts: - api.wifi-prd-us.zainar.net - api.wifi-prd-jpn.zainar.net auth: token query parameter (short-lived; obtained from the web app session) subscription: 'Channel selection is encoded in the URL query string, e.g. event=tracker:location' message_shape: '{"id": "", "update": {"events": {"tracker": {"location": {"x": , "y": , "z": , "meas_id": ""}}}}}' evidence: README.md, measure_latency.py (extract_location_from_event) - name: ILaaS protocol: websocket url_template: null auth: token query parameter subscription: 'Client sends a JSON setFilterOptions message after connect: {"action": "setFilterOptions", "accountResName": "", "siteResName": "", "messageTypes": [...]}; server replies with statusCode 200.' message_types: - location-updates - geomatch-updates - alerts-equipment - alerts-safety - alerts-system - alerts-zone - site-updates message_shape: '{"tagResName": "tag-", "measureType": "location", "x": , "y": , "z": , "timestamp": , "sns_timestamp": , "meas_id": ""}' units_note: 'ILaaS x/y/z are published in centimetres; the first-party client divides by 100 to obtain metres.' evidence: measure_latency.py (subscribe_ilaas, extract_location_from_event) - name: ZLP protocol: socket.io url_template: wss://zps-web-api.{env}.zainar.net namespace: /locations auth: 'JWT from the __session cookie issued by the ZPS web console (zps.zainartech.com)' events: - name: GET_NEW_LOCATION_HISTORY direction: server-to-client payload_fields: [location, locationTime] evidence: measure_latency.py (socketio handlers), README.md triggering: pattern: trigger-then-stream rest_operation: POST {baseURL}/nodes/{system_id}/action rest_base: https://api.wifi-prd-us.zainar.net/pipeline/r/api/v2/client description: 'A locate is requested over REST against a tracker or anchor node; the resulting location measurement arrives asynchronously on the event stream and is correlated back to the request via meas_id.' request_body_shape: '{"tracker"|"anchor": {"locate": {"repeat_count": , "backoff": }}, "tags": {"experimentID": "", "exp_tag": "", "ref_loc_id": "", "ref_xy": ""}}' node_types: tracker: [tag, tracker] anchor: [reader, anchor] gaps: - No AsyncAPI document published on any host. - No public event/webhook reference documentation. - Channel URLs for WiFi-Cloud and ILaaS must be lifted from an authenticated browser session; they are not discoverable anonymously. - No published event schema registry or versioning for event payloads. x-evidence: fetched: '2026-08-02' url: https://github.com/zainar/locate-latency-measurement-script http_status: 200 files: [README.md, measure_latency.py]