SSE Event Stream Viewer

Paste a captured text/event-stream response and select an event to inspect its fields. This viewer parses text without opening a live connection.

Runs locally in your browser
This viewer parses pasted text only. It does not connect to an endpoint or send stream data anywhere.
SSE stream textPaste text/event-stream frames separated by blank lines

Inspect protocol frames without opening a connection

Paste a captured text/event-stream response to debug field folding and event dispatch. Authentication, reconnect behavior, HTTP caching and connection health still belong in your client and server tests.

How to inspect a captured SSE stream

Paste a captured text/event-stream response and press Parse events. The viewer splits it into events and shows the event name, the ID a browser would report, the retry value and the folded data of each one; payloads that are valid JSON are decoded in the detail pane, and the whole stream can be copied out as NDJSON.

The parse follows the rules a browser applies to an EventSource stream, so a frame that appears here is a frame that will be dispatched in your client, and a block that is dropped here is dropped in the browser too. Everything runs in the page: no connection is opened and no captured text is uploaded.

  1. Paste the capture into the SSE stream text box.
  2. Press Parse events. The table lists every dispatched event; a stream that never closes a block with a blank line produces no events, exactly like a truncated connection.
  3. Click a row to inspect the complete payload of that event, including its decoded JSON.
  4. Press Copy NDJSON to take all events out of the page, or Clear to reset the workbench.

Field rules, IDs and dispatch timing

What the parser reads

Field names are matched literally: data, event, id and retry. One space after the colon is removed, so “data:x” and “data: x” carry the same value while “data: x” keeps one leading space. A line without a colon is a field name with an empty value, so a bare “data” line appends an empty line to the payload, and unknown fields are ignored.

Every data line is appended with a line feed; the folded payload keeps those breaks and loses the final one when the event is dispatched. Comments start with a colon and never dispatch an event; the counter reports how many were present.

IDs, retries and dispatch timing

An event is dispatched only when a blank line ends its block. The last unfinished block of a paste is discarded, which is what a browser does with a stream that ends mid-event; add the missing blank line if you want to see it. An id field sets the last event ID immediately, so a later event without an id carries the same value, and an empty “id:” clears it. An ID containing a NUL character is ignored. Only the event name falls back to “message”.

retry is accepted only when the value consists of digits; the metric shows the last accepted value, which is the reconnection time a client would use for the rest of the stream. The viewer does not measure how long the server took or whether a reconnection actually happened.

What this page does not do

The viewer reads text. It does not open an EventSource connection, send headers, authenticate, follow redirects or test how a server behaves under load, and it cannot tell whether a capture is complete. JSON detection is a strict parse of the folded payload, so “data: [DONE]” stays plain text while “data: null” counts as decoded JSON.

The events table shows the first 180 characters of each payload; the detail pane and the NDJSON copy contain the complete data. Long captures are parsed in the page, so a very large paste is limited by the memory of the device rather than by a server quota.

Recent tools: