Docs
/
Developer
/
API console
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.
Filter routes
Only /api/v1
api
25
POST
/api/v1/attempts
api.create_attempt
Record one timed execution of a case and refresh its score.
Try it
GET
/api/v1/cases
api.list_cases
List library cases with the current profile's score for each.
Try it
JSON body
{}
Send
/api/v1/cases
GET
/api/v1/cases/<key>
api.get_case
Full detail for one case: algorithms, media, mask, setup moves, score.
Try it
JSON body
{}
Send
/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
JSON body
{}
Send
/api/v1/cases/<key>/assess
DELETE
/api/v1/cases/<key>/focus
api.unfocus_case
Drop a case from the focus selection.
Try it
JSON body
{}
Send
/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
JSON body
{}
Send
/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
JSON body
{}
Send
/api/v1/cases/<key>/scramble
DELETE
/api/v1/cases/<key>/star
api.unstar_case
Remove a case from the todo list.
Try it
JSON body
{}
Send
/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
JSON body
{}
Send
/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
JSON body
{}
Send
/api/v1/cases/<key>/thumbnail.svg
POST
/api/v1/cube/apply
api.apply_moves
Apply a move sequence to a cube state.
Try it
JSON body
{}
Send
/api/v1/cube/apply
GET
/api/v1/export
api.export_profile
Everything recorded for the current profile, as one JSON document.
Try it
JSON body
{}
Send
/api/v1/export
GET
/api/v1/groups
api.list_groups
Every case group, with the number of cases in each.
Try it
JSON body
{}
Send
/api/v1/groups
POST
/api/v1/import
api.import_profile
Restore an exported document into the current profile.
Try it
JSON body
{}
Send
/api/v1/import
GET
/api/v1/phases
api.list_phases
The four CFOP phases with their case counts and target split times.
Try it
JSON body
{}
Send
/api/v1/phases
GET
/api/v1/scramble
api.get_scramble
A WCA-style random-move scramble and the state it produces.
Try it
JSON body
{}
Send
/api/v1/scramble
POST
/api/v1/solves
api.create_solve
Record one full solve, with optional CFOP phase splits.
Try it
JSON body
{}
Send
/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
JSON body
{}
Send
/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
JSON body
{}
Send
/api/v1/stats/progress
GET
/api/v1/stats/solves
api.stats_solves
Recorded full solves, newest first, with the WCA averages.
Try it
JSON body
{}
Send
/api/v1/stats/solves
GET
/api/v1/stats/spider
api.stats_spider
Radar-chart axes for the assessment overview.
Try it
JSON body
{}
Send
/api/v1/stats/spider
GET
/api/v1/stats/summary
api.stats_summary
Everything the dashboard shows, in one call.
Try it
JSON body
{}
Send
/api/v1/stats/summary
GET
/api/v1/stats/weakest
api.stats_weakest
The cases most worth practising right now.
Try it
JSON body
{}
Send
/api/v1/stats/weakest
POST
/api/v1/tracks
api.create_track
Store a solve track and return its short id.
Try it
JSON body
{}
Send
/api/v1/tracks
GET
/api/v1/tracks/<track_id>
api.get_track
Load a stored track by its short id.
Try it
JSON body
{}
Send
/api/v1/tracks/<track_id>
app
1
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
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
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
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.
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
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.
No route matches that filter.