The Keys board is now readable over the API, so anything you build can see your group's Midnight Season 1 key runs without scraping the site.
Two endpoints
Both are group-scoped reads under /v1, tagged Keys in the reference at /docs, and both work with an ordinary group key.
GET /v1/groups/{groupId}/keys/groupsreturns the planned runs from today onward, ordered by date then start time, reaching 21 days ahead. Each run carries its date and start time, the dungeons it plans to run, the organizer's note,openSeatCount, and all five seats in scarcity order with the character, class and spec in each.limitcaps the result between 1 and 100, defaulting to 50.GET /v1/groups/{groupId}/keys/lfgreturns everyone currently marked looking for a key: the characters they would bring with class, spec and role, whether they are freeanytimeor the specificwindowsthey named, and their note. An entry whose windows have all passed drops out on its own.
What they do and do not carry
Seats and pool entries travel by character name, the same posture as calendar signups. Roster member ids, character ids, organizer attribution, flex specs and join times are all withheld: a client rendering "who is in this run" needs the names and the seats, not the internal joins. A seat is taken when it has a characterName or a guestName, and open otherwise, which is the rule openSeatCount counts by.
Both endpoints answer 304 to a conditional request, and a run being cancelled breaks the validator, so a poller mirroring the board somewhere else sees the deletion rather than holding a stale copy.
As always, feedback and ideas are welcome in Discord.