Developer

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.