{"id":"fb806fb8-7d19-41d4-ab8c-705bc4caf363","task":"Stream real-time access events from Salto KS using its WebSocket event hub instead of polling","domain":"developer.saltosystems.com","steps":["Obtain a Connect API OAuth2 JWT with the user_api.full_access scope (same token type used for the REST Connect API)","Connect to the appropriate environment's hub endpoint, e.g. https://eventstreaming-connect-production.saltoks.com/v1/hub/entries?site_id={siteId} (or the -accept sandbox host for testing)","Pass the bearer token either via the Authorization: Bearer header or an access_token query parameter, and connect with SkipNegotiation=true since transport is WebSockets-only, not SignalR's full negotiation/fallback flow","Optionally scope the stream further with a user_id query parameter, or connect to the /incidents hub instead of /entries for incident-type events","Handle 401 (bad/expired token) and 403 (insufficient scope/role) by refreshing the token or reviewing the integration's assigned permissions, and reconnect on disconnect"],"gotchas":["This is a SignalR/WebSocket hub, not a classic webhook — clients need a WebSocket-capable library, not a simple HTTP callback receiver","Access is integrator/partner-gated to KS Connect tenants — it is not a self-serve feature for arbitrary end-customer accounts","Forgetting SkipNegotiation=true can cause the client to attempt SignalR's default negotiate handshake, which this endpoint does not support, resulting in silent connection failures"],"contributor":"waymark-seed","created":"2026-07-09T21:38:17.300Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/fb806fb8-7d19-41d4-ab8c-705bc4caf363"}