API console

Every route this instance has registered, read from the live Flask URL map when you loaded this page. Routes under /api/v1 get a try it panel that fires the request from your browser. The written reference lives in Developer → JSON API.

89 routes 25 under /api/v1 10 blueprints

These are real requests

The console talks to this running instance with your current profile session. GET is safe to poke at. Anything else writes to the database — the console asks you to confirm first, and you should point it at a scratch profile rather than the one holding your real times.

api 25

POST /api/v1/attempts api.create_attempt

Record one timed execution of a case and refresh its score.

Try it
/api/v1/attempts
GET /api/v1/cases api.list_cases

List library cases with the current profile's score for each.

Try it
/api/v1/cases
GET /api/v1/cases/<key> api.get_case

Full detail for one case: algorithms, media, mask, setup moves, score.

Try it
/api/v1/cases/<key>
POST /api/v1/cases/<key>/assess api.assess_case

Record a self-assessment for a case and refresh its score.

Try it
/api/v1/cases/<key>/assess
DELETE /api/v1/cases/<key>/focus api.unfocus_case

Drop a case from the focus selection.

Try it
/api/v1/cases/<key>/focus
POST /api/v1/cases/<key>/focus api.focus_case

Add a case to the "focus cases or skills" selection.

Try it
/api/v1/cases/<key>/focus
GET /api/v1/cases/<key>/scramble api.case_scramble

A scramble that leaves a solved cube in this case.

Try it
/api/v1/cases/<key>/scramble
DELETE /api/v1/cases/<key>/star api.unstar_case

Remove a case from the todo list.

Try it
/api/v1/cases/<key>/star
POST /api/v1/cases/<key>/star api.star_case

Add a case to the student's todo list.

Try it
/api/v1/cases/<key>/star
GET /api/v1/cases/<key>/thumbnail.svg api.case_thumbnail

The case diagram as a standalone SVG (``image/svg+xml``).

Try it
/api/v1/cases/<key>/thumbnail.svg
POST /api/v1/cube/apply api.apply_moves

Apply a move sequence to a cube state.

Try it
/api/v1/cube/apply
GET /api/v1/export api.export_profile

Everything recorded for the current profile, as one JSON document.

Try it
/api/v1/export
GET /api/v1/groups api.list_groups

Every case group, with the number of cases in each.

Try it
/api/v1/groups
POST /api/v1/import api.import_profile

Restore an exported document into the current profile.

Try it
/api/v1/import
GET /api/v1/phases api.list_phases

The four CFOP phases with their case counts and target split times.

Try it
/api/v1/phases
GET /api/v1/scramble api.get_scramble

A WCA-style random-move scramble and the state it produces.

Try it
/api/v1/scramble
POST /api/v1/solves api.create_solve

Record one full solve, with optional CFOP phase splits.

Try it
/api/v1/solves
GET /api/v1/stats/personal-bests api.stats_personal_bests

Best single, best averages, best phase splits and fastest cases.

Try it
/api/v1/stats/personal-bests
GET /api/v1/stats/progress api.stats_progress

Per-day solve times and CFOP splits over a window.

Try it
/api/v1/stats/progress
GET /api/v1/stats/solves api.stats_solves

Recorded full solves, newest first, with the WCA averages.

Try it
/api/v1/stats/solves
GET /api/v1/stats/spider api.stats_spider

Radar-chart axes for the assessment overview.

Try it
/api/v1/stats/spider
GET /api/v1/stats/summary api.stats_summary

Everything the dashboard shows, in one call.

Try it
/api/v1/stats/summary
GET /api/v1/stats/weakest api.stats_weakest

The cases most worth practising right now.

Try it
/api/v1/stats/weakest
POST /api/v1/tracks api.create_track

Store a solve track and return its short id.

Try it
/api/v1/tracks
GET /api/v1/tracks/<track_id> api.get_track

Load a stored track by its short id.

Try it
/api/v1/tracks/<track_id>

app 1

GET /healthz healthz

No docstring on the view function.

assessment 7

GET /assessment/ assessment.index

The assessment overview: scores, spider, projected time, coverage.

POST /assessment/goal assessment.set_goal

Change the profile's target goal and re-score against the new targets.

GET /assessment/spider.json assessment.spider_json

Spider axes for one level of the drill-down.

GET /assessment/wizard assessment.wizard

The wizard page. One step, with the run's index embedded for the browser.

POST /assessment/wizard/answer assessment.wizard_answer

Record an answer.

GET /assessment/wizard/step assessment.wizard_step

One rendered step, for the browser's prefetch cache.

GET /assessment/wizard/summary assessment.wizard_summary

What this run changed, the new phase scores, and where to go next.

docs 4

GET /docs/ docs.index

Documentation landing page.

GET /docs/<path:page> docs.page

Render one markdown file from the docs tree.

GET /docs/api docs.api_console

Interactive API console: every registered route, with a try-it panel.

GET /docs/search.json docs.search_index

Client-side search index: one entry per documentation page.

drills 11

GET /drills/ drills.index

Session setup: pick a kind, see what the app would drill, and go.

GET /drills/history drills.history

Every session that recorded at least one rep.

GET /drills/session/<int:session_id> drills.session

The drill runner — thumbnail, scramble, timer, one rep at a time.

POST /drills/session/<int:session_id>/assess drills.assess

Re-rate a case mid-session — the moment right after a fumble is when a

POST /drills/session/<int:session_id>/end drills.end

Close the session and go to the summary. Everything recorded is kept.

POST /drills/session/<int:session_id>/extend drills.extend

Append another round of reps — the endless mode's engine.

POST /drills/session/<int:session_id>/rep drills.rep

Record one repetition and hand back the refreshed case score.

POST /drills/session/<int:session_id>/skip drills.skip

Drop a rep without recording anything — a mis-scramble, a phone call.

POST /drills/session/<int:session_id>/star drills.star

Toggle the case's star without leaving the runner.

GET /drills/session/<int:session_id>/summary drills.summary

What the session actually changed.

GET POST /drills/start drills.start

Generate a session and drop straight into the runner.

library 8

GET /library/ library.index

No docstring on the view function.

GET /library/<phase> library.phase

No docstring on the view function.

GET /library/case/<key> library.case

No docstring on the view function.

POST /library/case/<key>/assess library.assess

No docstring on the view function.

POST /library/case/<key>/play library.record_play

Count one viewing of an algorithm's animation.

POST /library/case/<key>/star library.toggle_star

No docstring on the view function.

POST /library/prefs library.prefs

Persist the list's sort/view/top-colour choice without navigating.

GET /library/starred library.starred

The todo list: everything the student has flagged for extra practice.

main 9

GET / main.dashboard

No docstring on the view function.

GET /profiles main.profiles_page

No docstring on the view function.

POST /profiles main.create_profile

No docstring on the view function.

GET /profiles/<int:profile_id> main.profile_detail

No docstring on the view function.

POST /profiles/<int:profile_id>/delete main.delete_profile

Delete a profile and everything it recorded. Name required to confirm.

GET /profiles/<int:profile_id>/export.json main.export_profile

Everything this profile has recorded, as a downloadable JSON document.

POST /profiles/<int:profile_id>/reset main.reset_profile

Wipe a profile's history. Requires the profile name typed back.

POST /profiles/<int:profile_id>/select main.select_profile

No docstring on the view function.

POST /profiles/<int:profile_id>/update main.update_profile

Rename, re-goal and set the per-profile preferences in one submit.

plans 16

GET /plans/ plans.index

No docstring on the view function.

GET /plans/<slug> plans.detail

No docstring on the view function.

POST /plans/<slug>/block/<int:index>/complete plans.complete_block

Mark a block done by hand — rests, notes, and 'I did this away from the app'.

POST /plans/<slug>/block/<int:index>/start plans.start_block

Generate the session for one block and hand off to the drill runner.

POST /plans/<slug>/delete plans.delete

No docstring on the view function.

POST /plans/<slug>/duplicate plans.duplicate

The way to 'edit' a built-in: take a copy you own.

GET /plans/<slug>/edit plans.edit

No docstring on the view function.

POST /plans/<slug>/edit plans.update

No docstring on the view function.

GET /plans/<slug>/export.json plans.export_plan

No docstring on the view function.

POST /plans/<slug>/leave plans.leave

No docstring on the view function.

POST /plans/<slug>/start plans.start

Enrol, resume or restart. Also the endpoint the adapt controls save to.

GET /plans/import plans.import_form

No docstring on the view function.

POST /plans/import plans.import_plan

No docstring on the view function.

GET /plans/new plans.new

No docstring on the view function.

POST /plans/new plans.create

No docstring on the view function.

POST /plans/preview plans.preview

Live preview for the builder: a config in, an expansion out.

timer 7

GET /timer/ timer.index

The timer: scramble, big clock, live statistics, solve list.

GET /timer/export timer.export

Download the whole solve history as JSON.

GET /timer/scramble timer.scramble

A fresh WCA-style scramble. ``?seed=`` reproduces one.

POST /timer/solves timer.create_solve

Record one full solve, with optional CFOP splits.

POST /timer/solves/<int:solve_id> timer.update_solve

Change a solve's penalty or comment after the fact.

POST /timer/solves/<int:solve_id>/delete timer.delete_solve

Remove a solve entirely — a mis-start that never was a solve.

GET /timer/stats timer.stats_json

Current solve statistics for the active profile.

viewer 1

GET /viewer/ viewer.index

No docstring on the view function.