10.9 WSS /stream — realtime publish stream
Connection:
wss://zippfeed.com/api/v1/developer/stream?key=zk_xxx
On connect (server → client):
{"type": "ready", "ts": "2026-05-22T10:00:00Z", "session_id": "sess_abc123"}
Each new post:
{
"type": "post.created",
"ts": "2026-05-22T10:00:01Z",
"data": { ...lean post shape (same as GET /posts)... }
}
Heartbeat (every 30s server → client):
{"type": "ping", "ts": "..."}
Client behavior: if no ping in 60s → reconnect.
Constraints:
- Max 5 concurrent connections per workspace
- All langs, all categories — server-side filter NOT supported; client
filters on data.lang, data.categories, etc.
- Catch-up after disconnect: client polls GET /posts?after=<last_id>
to fill the gap (no in-stream replay)
- Events do not count against daily quota
Minimal client (vanilla JS):
const WS_URL = "wss://zippfeed.com/api/v1/developer/stream?key=zk_YOUR_KEY";
let ws, lastEvent = Date.now();
function connect() {
ws = new WebSocket(WS_URL);
ws.addEventListener("message", (e) => {
lastEvent = Date.now();
const ev = JSON.parse(e.data);
switch (ev.type) {
case "ready":
// ev.session_id — useful for log correlation
break;
case "ping":
// server keepalive; nothing to do
break;
case "post.created":
handleNewPost(ev.data); // lean shape, same as GET /posts
break;
}
});
ws.addEventListener("close", () => setTimeout(connect, 1000));
}
// Reconnect if no event (data or ping) in 60s.
setInterval(() => {
if (Date.now() - lastEvent > 60_000 && ws) ws.close();
}, 10_000);
connect();
After reconnect: keep the id of the last post you processed; on
the next connect() call GET /posts?after=<last_id>&limit=20 once
to backfill anything that streamed while you were offline. The WSS
itself does not replay events.