Interactive streaming API explorer for FastAPI — SSE, WebSocket, and beyond
Project description
fastapi-stream-ui
Interactive streaming API explorer for FastAPI — built for SSE and WebSocket endpoints.
Stream-ui mounts directly into your FastAPI app (just like /docs or /redoc) and gives you a live UI to connect, test, and watch streaming endpoints in real time.
pip install fastapi-stream-ui
Quickstart
from fastapi import FastAPI
from stream_ui import StreamUI, sse_endpoint, ws_endpoint
app = FastAPI()
@app.get("/events")
@sse_endpoint(summary="Live event feed", tags=["Streaming"])
async def events():
...
@app.websocket("/ws/chat")
@ws_endpoint(summary="Chat socket", tags=["Streaming"], path="/ws/chat")
async def chat(websocket): ...
StreamUI(app).mount()
# → http://localhost:8000/stream-ui
Decorators
@sse_endpoint(...)
Marks a route as a Server-Sent Events endpoint for Stream-ui discovery.
@app.get("/stream/prices")
@sse_endpoint(
summary="Price ticker",
description="Streams live market prices.",
tags=["Market"],
params=[
{
"name": "symbol",
"in": "query",
"description": "Asset symbol to track",
"required": False,
"default": "BTC",
"type": "string",
}
],
)
async def prices(symbol: str = "BTC"):
async def gen():
while True:
yield f"data: {symbol}:{get_price()}\n\n"
await asyncio.sleep(1)
return StreamingResponse(gen(), media_type="text/event-stream")
@ws_endpoint(...)
Marks a WebSocket route for Stream-ui discovery.
@app.websocket("/ws/echo")
@ws_endpoint(
summary="Echo socket",
description="Echoes every message back.",
tags=["Sockets"],
path="/ws/echo", # required — WS routes aren't in OpenAPI
)
async def echo(websocket: WebSocket):
await websocket.accept()
while True:
msg = await websocket.receive_text()
await websocket.send_text(f"echo: {msg}")
Decorator parameters
| Parameter | Type | Description |
|---|---|---|
summary |
str |
Short label shown in the sidebar |
description |
str |
Longer description shown below the toolbar (markdown ok) |
tags |
list[str] |
Grouping tags (same convention as FastAPI) |
path |
str | None |
Override the route path (required for WS routes) |
params |
list[dict] |
Extra param hints (see below) |
Param dict shape
{
"name": "symbol", # field name
"in": "query", # "query" | "path"
"description": "...", # tooltip / placeholder
"required": False,
"default": "BTC",
"type": "string", # for future type-aware inputs
}
Note: For SSE routes, Stream-ui also auto-reads params from the OpenAPI schema —
params=is for adding hints that FastAPI can't infer (e.g. dynamic query params), or for overriding descriptions.
Stacking decorators
Decorators are order-independent and non-interfering. Both of these work:
# @sse_endpoint above @app.get
@sse_endpoint(summary="Feed")
@app.get("/feed")
async def feed(): ...
# @sse_endpoint below @app.get (more idiomatic)
@app.get("/feed")
@sse_endpoint(summary="Feed")
async def feed(): ...
Stream-ui walks the __wrapped__ chain so the metadata is found regardless of position.
Auth
Stream-ui handles auth the same way Swagger UI does — you provide credentials once in the sidebar, and they are injected into every connection.
Bearer token: Injected as Authorization: Bearer <token> (HTTP header for SSE, query param _token as fallback, included in WS URL query string).
API key: Optional X-API-Key header field (enable with enable_api_key=True).
StreamUI(
app,
default_token="dev-secret-token", # pre-fills the auth panel
enable_api_key=True,
).mount()
On the server side, check both header and fallback query param:
def get_token(
authorization: str | None = Header(default=None),
_token: str | None = Query(default=None),
):
if authorization:
return authorization.removeprefix("Bearer ").strip()
return _token
StreamUI options
StreamUI(
app,
path="/stream-ui", # URL prefix (default: "/stream-ui")
title="Stream-ui", # Browser tab title
default_token=None, # Pre-fill bearer token field
enable_api_key=True, # Show API key field in auth panel
).mount()
License
Apache License 2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_stream_ui-0.1.2.tar.gz.
File metadata
- Download URL: fastapi_stream_ui-0.1.2.tar.gz
- Upload date:
- Size: 25.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e77ae46ff7b8f816b0129be384563e83fd770b340c28cda077cfa71fff312034
|
|
| MD5 |
b5f5aa4238431ac15a27c6c6c4692e4f
|
|
| BLAKE2b-256 |
c80a62b858b2b171d76682d729f53bf6aaa7367f18256171b7b81df472dfb0e4
|
File details
Details for the file fastapi_stream_ui-0.1.2-py3-none-any.whl.
File metadata
- Download URL: fastapi_stream_ui-0.1.2-py3-none-any.whl
- Upload date:
- Size: 23.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf98fe7bb2d71bc75a7855a1714264f1b925a1bfd493877e198be07a664e1c0d
|
|
| MD5 |
40166ddca56ae26a9315038f54c08ad2
|
|
| BLAKE2b-256 |
4e76e96a56ab6bfe750de3f774c8e8f8b6f0d0464f442ae94a54562eebd2238c
|