🃏 Story Points GitHub Create a room →
🕐 Last updated 2026-07-15 | | Ⓜ️ View as Markdown | 🤖 Agent setup

API

Story Points deliberately ships no tracker-specific integrations. Instead, every room exposes a tiny plain-HTTP surface. The room slug is the capability — same trust model as the app itself — so anything that can run curl can bridge to Jira, Linear, GitHub, or your own tooling.

Base URL: https://story-points.danielrose7.workers.dev

Authentication: there is none, by design. No OAuth, no API keys, no signup — and none are coming. The room slug (plus the optional room code below) is the entire credential, scoped to exactly one room and shared the same way the room itself is. That's a philosophy, not an omission: key machinery is accounts by the back door, tokens parked in scripts and CI logs leak, and the zero-ceremony surface is what lets you point your own agent at a room with nothing but the URL it was invited with.

Protected rooms: a host can require a 6-character room code (off by default). When enabled, queue and export need it — ?code=ABC123 or an X-Room-Code: ABC123 header — and return 401 without it. Invite links carry the code (/room/<room>?code=ABC123). Code checks are rate-limited: ten wrong guesses locks checking for ~15 minutes.

Import tickets into the queue

POST /api/room/<room>/queue

Plain text (one story per line) or JSON. Appends by default; ?mode=replace swaps the whole queue. Connected clients see imports live.

# Plain text
printf 'Login flow rework\nRate limiter for API\n' | \
  curl -X POST --data-binary @- \
  https://story-points.danielrose7.workers.dev/api/room/<room>/queue

# JSON
curl -X POST -H 'Content-Type: application/json' \
  -d '{"items":["Login flow rework","Rate limiter"]}' \
  'https://story-points.danielrose7.workers.dev/api/room/<room>/queue?mode=replace'

Response: {"queued": <total items now in queue>}. Limits: 100 items, 500 chars each. Returns 403 if the room's host has switched the ticket queue off, 400 for unparseable bodies.

Export the session

GET /api/room/<room>/export — JSON: room name, current queue, and round history (story, ISO end time, duration in seconds, deck-ordered vote counts).

GET /api/room/<room>/export?format=csv — the history as CSV (story,ended_at,duration_seconds,votes).

curl https://story-points.danielrose7.workers.dev/api/room/<room>/export

Returns 404 for rooms that don't exist yet.

Peek at a room

GET /api/room/<room>/peek — {"exists": bool, "name"?: string, "theme"?: string}. Cheap existence check; doesn't create the room.

Realtime

The app itself runs over a WebSocket at /api/room/<room>/ws?u=<user-id> with JSON messages (join, vote, reveal, clear, story, queue, settings, …). It's an internal protocol — no compatibility promises — but it's plain JSON if you want to script a bot; see shared/types.ts in the repo for message shapes.

Agent setup

One step for any agent — see the Agent setup guide:

Fetch https://story-points.danielrose7.workers.dev/agent-setup/prompt.md and follow it

Or point your coding agent or MCP tool at /llms.txt — it indexes these docs in Markdown. Every docs page also serves a raw Markdown twin at the same URL with .md appended (e.g. /docs/api.md), and /llms-full.txt bundles all pages in one fetch. A typical agent workflow:

# 1. Learn the surface
curl https://story-points.danielrose7.workers.dev/llms.txt
# 2. Import the backlog you were asked to estimate
your-tracker-cli list --sprint 42 | curl -X POST --data-binary @- \
  https://story-points.danielrose7.workers.dev/api/room/<room>/queue
# 3. After the session, collect results and write them back
curl https://story-points.danielrose7.workers.dev/api/room/<room>/export