Skip to main content
POST
Create session

Body

application/json

POST /v1/projects/{project_id}/sessions

title is required (2026-05-16, migration 094). session_number alone is not a unique identifier - there is no UNIQUE constraint on (project_id, session_number) and series_id is auto-generated per session today, so two Game Nights both numbered "1" are valid state. Without a title the dashboard list shows two indistinguishable rows.

session_number
integer
required
Required range: x >= 1
title
string
required

User-facing session name

Required string length: 1 - 200
synopsis
string | null

Short prose summary of the session

Maximum string length: 5000
project_context
string | null
Maximum string length: 50000
npc_ids
string<uuid>[]

NPCs to include

encounter_ids
string<uuid>[]

Encounters to include

Response

Session created

Session resource representation.

Carries the full mutable field set so the create response and the detail GET both round-trip what the edit form needs. project_context / npc_ids / encounter_ids were added 2026-05-14 - before that the response omitted them and the dashboard edit form had nothing to read.

id
string
required
session_number
integer
required
project_id
string
required
external_id
string | null

Human-readable slug for the URL (/projects/<slug>/sessions/<external_id>). Derived from title (or session-<N> fallback) at create time and immutable. May be null on legacy rows pre-migration 102.

title
string | null
synopsis
string | null
project_context
string | null
npc_ids
string<uuid>[]
encounter_ids
string<uuid>[]
status
string
default:brainstorm
series_id
string | null
created_at
string<date-time> | null