ZaiNar · AsyncAPI Specification

Zainar Event Surface

Version

View Spec View on GitHub CompanyLocationPositioningNavigationTimingWirelessReal-Time LocationAsset TrackingIoTPhysical AIAsyncAPIWebhooksEvents

AsyncAPI Specification

zainar-event-surface.yml Raw ↑
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": "<node id>", "update": {"events": {"tracker": {"location":
    {"x": <number>, "y": <number>, "z": <number>, "meas_id": "<string>"}}}}}'
  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": "<acct-...>", "siteResName":
    "<site>", "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-<id>", "measureType": "location", "x": <cm>,
    "y": <cm>, "z": <cm>, "timestamp": <epoch_ms>, "sns_timestamp": <epoch_ms>,
    "meas_id": "<string>"}'
  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": <int>,
    "backoff": <ms>}}, "tags": {"experimentID": "<string>", "exp_tag": "<string>",
    "ref_loc_id": "<string>", "ref_xy": "<x,y,z>"}}'
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]