/v1/projects/{projectId}/files/streamSessionSubscribe to file changes
Hold an SSE connection open and receive the file list on every change — how you watch an ingestion settle.
A baseline frame arrives immediately on connect — `[]` when the project is empty — so you can tell "connected, nothing here" from "no frame yet".
A file leaving the set arrives as an `{id, removed}` tombstone. The connection heartbeats every 25 seconds; a missed heartbeat means reconnect.
The same `/stream` suffix exists on `cells`, `entities`, and `factions`.
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
| projectId | string | required | The project to watch. |
curl -X GET "https://runlog-7613480744.us-central1.run.app/v1/projects/p7Kd2mQx/files/stream" \
-H "Authorization: Bearer $RUNLOG_SESSION_TOKEN" \
-H "X-Project-Id: p7Kd2mQx"data: [{"fileId":"4mHqZ1nR8vTbC0sWyLpAeGkJ3dXfU6iO2rN","status":"ready"}]Errors
| Status | error | When |
|---|---|---|
| 404 | project not found | The project does not exist, or you have no access to it. Projects are non-enumerable, so a denied read is indistinguishable from a missing one. |
| 401 | invalid API key | The `Authorization` header is missing, malformed, or names a revoked key. |
| 400 | name the target project via the X-Project-Id header or projectId query | No project was named and the key is not bound to one. |
| 429 | rate limit exceeded | You passed 60 requests/minute on this key. `Retry-After` carries the seconds to wait. |
| 500 | internal error | The relay failed to serve the request. Retry with backoff; the cause is logged server-side against your request. |