API
Make a token on your Settings page. Send it as Authorization: Bearer pf1_….
GET /api/v1/version
GET /api/v1/months/current
GET /api/v1/problems/<slug>/<YYYY-MM>
GET /api/v1/leaderboards?month=YYYY-MM
GET /api/v1/leaderboards/<YYYY-MM>/<slug|global>
GET /api/v1/leaderboards/alltime
GET /api/v1/leaderboards/firsts?month=
GET /api/v1/month
GET /api/v1/month/board?edition=<edition>
GET /api/v1/bounty
GET /api/v1/me
GET /api/v1/me/<YYYY-MM>
GET /api/v1/me/<YYYY-MM>/<slug>
GET /api/v1/me/<YYYY-MM>/<slug>/<NN>/instance (the first fetch, or a download on the website, starts your clock: they count the same)
POST /api/v1/me/<YYYY-MM>/<slug>/<NN>/answer Idempotency-Key: <uuid> {"answer": "123", "solver": "optional"}
GET /api/v1/me/<YYYY-MM>/<slug>/released
GET /api/v1/me/month/<YYYY-MM|edition>
GET /api/v1/me/month/<YYYY-MM>/<NN>/instance
POST /api/v1/me/month/<YYYY-MM>/<NN>/answer
GET /api/v1/me/answers?month=YYYY-MM
You can send one answer per minute for each rung; sooner, the reply is 429 with the seconds left. The reply is accepted, not_accepted or malformed. Rung 00 is practice. It does not count toward your score.
/api/v1/leaderboards/firsts?month=YYYY-MM gives, for each problem of the month, one row per rung 01-12 that someone opened: first (the first accepted answer to the rung: handle, public id, received_at), quickest (the shortest time from first download to accepted answer: handle, public id, solve_seconds; on a tie the earlier answer), average_seconds, median_seconds (for an even count the mean of the two middle times, to the millisecond), opened (climbers who pressed "Show this problem", downloaded the rung or solved it that month), solved and percent (whole percent of them who solved it). From the 2026-11 month on, staff are left out of all of these. Its potm list gives the same for the Problem of the Month, rungs 01 to 12: one entry per edition that counts toward that month.