pdf-quiz-generator/backend/tests/api-contract.json
Daniel e72cdd6716 feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs
**The API.** Every route now lives under `/api/v1`, with `/api/...` rewritten
onto it — one route, two spellings, so they cannot drift and the OpenAPI
document describes each endpoint once. Errors carry an `error` object with a
stable code, one human sentence and, for a validation failure, the fields that
were wrong; `detail` is untouched so nothing that reads it breaks. The whole
surface — 320 routes, their parameters and their status codes — is checked in
as `backend/tests/api-contract.json`, and a test fails on any difference,
naming the routes that moved. `docs/api.md` is the contract in prose.

**Refresh tokens**, so an app can stay signed in without keeping a password.
Rows rather than signatures: listable, withdrawable, stored as hashes, rotated
on every use. A spent token coming back ends the whole session, because a theft
and a replay look identical from the server and the safe reading is the unsafe
one. A browser is not given one — it has nowhere to put it and a person to ask.

**An end-to-end stack**: `docker-compose.test.yml` with its own Postgres and
Redis, `e2e/seed.py` for the smallest world the tests name, and Playwright with
five projects — desktop, iPhone, Pixel, iPad and a browserless API project.
Devices because every bug reported this week was a phone bug found by a person
looking at a screenshot; a desktop-only suite would have passed through all of
them. Forty tests, five clean runs.

It found four things in its first hour:

- **A fresh deploy could not start.** `create_all()` ran before
  `CREATE EXTENSION vector`, so any database that had never had pgvector
  installed died on the first table with a vector column. Invisible here
  because this one has had the extension for a year.
- **A figure in a published article was a 404 for everyone but an admin.**
  Media in the library is nobody's to read by default, and nothing made an
  exception for a drawing an article actually shows — so every illustration
  added this week was an empty box for every real user.
- **Every rate limit was one bucket for the whole site.** The backend saw
  nginx's address for every request, so ten bad passwords from anybody locked
  out everybody, and no log line could say who. nginx now takes the real
  address from the proxy and overwrites the header on the way in; uvicorn runs
  with --proxy-headers.
- **The reading page's breakpoints disagreed** — 1150px in the component,
  820px in the stylesheet. Between them the menu button claimed the contents
  drawer and then toggled a class on a rail that was still in the layout: the
  contents did not open and the site menu did not either. The button was dead
  on every tablet.

And two smaller ones: the login limiter counted successful sign-ins, so eleven
people behind one hospital NAT locked each other out — it is cleared by a
correct password now; and `/uploads/{path}` served GET and HEAD from one route
with one operation id, which makes every OpenAPI client generator refuse the
document.

The first admin's password is generated and printed once at first start when
`DEFAULT_ADMIN_PASSWORD` is blank, rather than the account not existing:
`docker compose logs backend | grep -A3 "FIRST ADMIN"`.

CI (`.forgejo/workflows/tests.yml`) runs the backend suite, the contract, the
frontend suite and the build on every push to dev, main or master, and the
end-to-end stack on those branches and on pull requests into them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
2026-09-13 01:23:38 +02:00

3015 lines
56 KiB
JSON

{
"routes": {
"DELETE /api/v1/access/{user_id}/grants/{kind}/{target_id}": {
"body": false,
"params": [
"path:kind",
"path:target_id",
"path:user_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/admin/invites/{invite_id}": {
"body": false,
"params": [
"path:invite_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/admin/models/{model_id}": {
"body": false,
"params": [
"path:model_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/admin/users/{user_id}": {
"body": false,
"params": [
"path:user_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/ai/conversations/{conversation_id}": {
"body": false,
"params": [
"path:conversation_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/articles/trash/{article_id}": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/articles/{article_id}": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"DELETE /api/v1/articles/{article_id}/claims/{claim_id}": {
"body": false,
"params": [
"path:article_id",
"path:claim_id",
"query:keep_links?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/articles/{article_id}/links/{question_id}": {
"body": false,
"params": [
"path:article_id",
"path:question_id",
"query:section_id?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/articles/{article_id}/notes/{section_id}": {
"body": false,
"params": [
"path:article_id",
"path:section_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/attempts/progress/{attempt_id}": {
"body": false,
"params": [
"path:attempt_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/auth/sessions/{family}": {
"body": false,
"params": [
"path:family"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/categories/{category_id}": {
"body": false,
"params": [
"path:category_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/collections/{collection_id}": {
"body": false,
"params": [
"path:collection_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/collections/{collection_id}/articles/{article_id}": {
"body": false,
"params": [
"path:article_id",
"path:collection_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/collections/{collection_id}/questions/{question_id}": {
"body": false,
"params": [
"path:collection_id",
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/documents/{document_id}": {
"body": false,
"params": [
"path:document_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/documents/{document_id}/sections/{section_id}": {
"body": false,
"params": [
"path:document_id",
"path:section_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/drafts/batches/{batch_id}": {
"body": false,
"params": [
"path:batch_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/drafts/{draft_id}": {
"body": false,
"params": [
"path:draft_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/exams/{exam_id}/assign": {
"body": true,
"params": [
"path:exam_id"
],
"responses": [
"200",
"422"
]
},
"DELETE /api/v1/favorites/{question_id}": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/feedback/articles/reports/{feedback_id}": {
"body": false,
"params": [
"path:feedback_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/feedback/{feedback_id}": {
"body": false,
"params": [
"path:feedback_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/flashcards/cards/{card_id}": {
"body": false,
"params": [
"path:card_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/flashcards/cards/{card_id}/links/article/{article_id}": {
"body": false,
"params": [
"path:article_id",
"path:card_id",
"query:article_section_id?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/flashcards/cards/{card_id}/links/question/{question_id}": {
"body": false,
"params": [
"path:card_id",
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/flashcards/{deck_id}": {
"body": false,
"params": [
"path:deck_id",
"query:permanent?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/flashcards/{deck_id}/share": {
"body": false,
"params": [
"path:deck_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/folders/{folder_id}": {
"body": false,
"params": [
"path:folder_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/folders/{folder_id}/questions/{question_id}": {
"body": false,
"params": [
"path:folder_id",
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/media/libraries/{library_id}/grants/{user_id}": {
"body": false,
"params": [
"path:library_id",
"path:user_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/media/{media_id}": {
"body": false,
"params": [
"path:media_id",
"query:force?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/question-categories/{cat_id}": {
"body": false,
"params": [
"path:cat_id",
"query:move_to?"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/question-categories/{cat_id}/grants/{user_id}": {
"body": false,
"params": [
"path:cat_id",
"path:user_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/questions/figures/{figure_id}": {
"body": false,
"params": [
"path:figure_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/questions/{question_id}": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/questions/{question_id}/permanent": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/quizzes/{quiz_id}": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/quizzes/{quiz_id}/permanent": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/quizzes/{quiz_id}/questions/{question_id}": {
"body": false,
"params": [
"path:question_id",
"path:quiz_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/quizzes/{quiz_id}/share-link": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/study-plans/blocks/{block_id}": {
"body": false,
"params": [
"path:block_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/study-plans/reading/{link_id}": {
"body": false,
"params": [
"path:link_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/study-plans/{plan_id}": {
"body": false,
"params": [
"path:plan_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/study-tools/lab-values/{entry_id}": {
"body": false,
"params": [
"path:entry_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/study-tools/lab-values/{entry_id}/cards/{card_id}": {
"body": false,
"params": [
"path:card_id",
"path:entry_id"
],
"responses": [
"204",
"422"
]
},
"DELETE /api/v1/tags/{tag_id}": {
"body": false,
"params": [
"path:tag_id",
"query:move_to?"
],
"responses": [
"204",
"422"
]
},
"GET /api/health": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/access/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/access/tree": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/admin/classification-snapshots": {
"body": false,
"params": [
"query:limit?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/admin/embedding/health": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/admin/invites": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/admin/models": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/admin/models/available": {
"body": false,
"params": [
"query:task?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/admin/settings": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/admin/users": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/ai/conversations": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/ai/conversations/{conversation_id}": {
"body": false,
"params": [
"path:conversation_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/": {
"body": false,
"params": [
"query:category_id?",
"query:q?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/by-slug/{slug}": {
"body": false,
"params": [
"path:slug"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/editorial/queue": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/articles/job/{job_id}": {
"body": false,
"params": [
"path:job_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/preview/{slug}": {
"body": false,
"params": [
"path:slug"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/recent": {
"body": false,
"params": [
"query:limit?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/trash": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/articles/{article_id}": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/cards": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/claims": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/links/from-category": {
"body": false,
"params": [
"path:article_id",
"query:category_id",
"query:include_subtopics?",
"query:section_id?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/notes": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/questions": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/revisions": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/articles/{article_id}/revisions/{revision_id}": {
"body": false,
"params": [
"path:article_id",
"path:revision_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/": {
"body": false,
"params": [
"query:quiz_id?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/history": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/attempts/in-progress": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/attempts/progress": {
"body": false,
"params": [
"query:quiz_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/quiz/{quiz_id}/analysis": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/quiz/{quiz_id}/in-progress": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/stats/dashboard": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/attempts/{attempt_id}": {
"body": false,
"params": [
"path:attempt_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/{attempt_id}/analysis": {
"body": false,
"params": [
"path:attempt_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/attempts/{attempt_id}/recommendations": {
"body": false,
"params": [
"path:attempt_id",
"query:group?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/auth/me": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/me/settings": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/sessions": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/signup-policy": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/sso/callback": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/sso/config": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/sso/login": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/auth/verify-email": {
"body": false,
"params": [
"query:token"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/categories/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/collections/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/collections/for-article/{article_id}": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/collections/{collection_id}/articles": {
"body": false,
"params": [
"path:collection_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/collections/{collection_id}/questions": {
"body": false,
"params": [
"path:collection_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/contact/submissions": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/documents/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/documents/{document_id}": {
"body": false,
"params": [
"path:document_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/documents/{document_id}/processing-steps": {
"body": false,
"params": [
"path:document_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/documents/{document_id}/status": {
"body": false,
"params": [
"path:document_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/drafts/batches": {
"body": false,
"params": [
"query:status?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/drafts/batches/{batch_id}": {
"body": false,
"params": [
"path:batch_id",
"query:status?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/exams/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/exams/{exam_id}/blueprint": {
"body": false,
"params": [
"path:exam_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/favorites": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/feedback/articles/{article_id}": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/feedback/articles/{article_id}/mine": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/feedback/open": {
"body": false,
"params": [
"query:limit?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/feedback/questions/{question_id}": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/feedback/questions/{question_id}/mine": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/": {
"body": false,
"params": [
"query:category_id?",
"query:include_deleted?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/cards/browse": {
"body": false,
"params": [
"query:deck_id?",
"query:limit?",
"query:offset?",
"query:q?",
"query:tag_ids?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/cards/browse/ids": {
"body": false,
"params": [
"query:deck_id?",
"query:q?",
"query:tag_ids?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/cards/linked": {
"body": false,
"params": [
"query:article_id?",
"query:question_id?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/cards/{card_id}/links": {
"body": false,
"params": [
"path:card_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/questions/{question_id}/cards": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/shared": {
"body": false,
"params": [
"query:limit?",
"query:offset?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/trash": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/flashcards/{deck_id}": {
"body": false,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/flashcards/{deck_id}/study": {
"body": false,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/folders/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/folders/{folder_id}/questions": {
"body": false,
"params": [
"path:folder_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/media/": {
"body": false,
"params": [
"query:library_id?",
"query:limit?",
"query:offset?",
"query:q?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/media/by-path": {
"body": false,
"params": [
"query:path"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/media/libraries": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/mynote": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/public/stats": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/question-categories/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/question-categories/grantable-users": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/question-categories/grants": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/question-categories/my-grants": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/questions/bank": {
"body": false,
"params": [
"query:article_ids?",
"query:category_id?",
"query:category_ids?",
"query:difficulty?",
"query:favorites_only?",
"query:folder_id?",
"query:limit?",
"query:my_questions?",
"query:needs?",
"query:offset?",
"query:q?",
"query:quiz_id?",
"query:tag_ids?",
"query:uncategorized?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/bank/ids": {
"body": false,
"params": [
"query:category_id?",
"query:category_ids?",
"query:favorites_only?",
"query:folder_id?",
"query:q?",
"query:quiz_id?",
"query:tag_ids?",
"query:uncategorized?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/builder/count": {
"body": false,
"params": [
"query:article_ids?",
"query:category_ids?",
"query:difficulty?",
"query:state?",
"query:system_ids?",
"query:tag_ids?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/builder/prepared": {
"body": false,
"params": [
"query:count?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/detail/{question_id}": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/detail/{question_id}/figures": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/detail/{question_id}/note": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/detail/{question_id}/versions": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/export/qti": {
"body": false,
"params": [
"query:question_ids?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/images": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/questions/import/sample": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/questions/manage/summary": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/questions/trash": {
"body": false,
"params": [
"query:limit?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/questions/{question_id}/articles": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/quizzes/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/quizzes/job/{job_id}": {
"body": false,
"params": [
"path:job_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/quizzes/jobs": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/quizzes/search": {
"body": false,
"params": [
"query:mode?",
"query:q"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/quizzes/sessions": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/quizzes/share-policy": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/quizzes/trash": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/quizzes/{quiz_id}": {
"body": false,
"params": [
"path:quiz_id",
"query:attempt_id?",
"query:study?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/quizzes/{quiz_id}/questions": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/quizzes/{quiz_id}/review": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/search": {
"body": false,
"params": [
"query:kinds?",
"query:limit?",
"query:q?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/search/suggest": {
"body": false,
"params": [
"query:limit?",
"query:q?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/share/{token}": {
"body": false,
"params": [
"path:token"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/study-plans/": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/study-plans/{plan_id}": {
"body": false,
"params": [
"path:plan_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/study-tools/answer-split": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/study-tools/attempts/{attempt_id}/questions/{question_id}/responses": {
"body": false,
"params": [
"path:attempt_id",
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/study-tools/completion": {
"body": false,
"params": [
"query:days?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/study-tools/lab-values": {
"body": false,
"params": [
"query:include_drafts?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/study-tools/performance-by-category": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/study-tools/performance-over-time": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/study-tools/readiness": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/study-tools/recommendations": {
"body": false,
"params": [
"query:group?",
"query:limit?"
],
"responses": [
"200",
"422"
]
},
"GET /api/v1/tags": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/teach/models": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/teach/policy": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/teach/prompt": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /api/v1/tts/voices": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"GET /uploads/{path}": {
"body": false,
"params": [
"path:path",
"query:attempt_id?",
"query:w?"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/ai/conversations/{conversation_id}": {
"body": true,
"params": [
"path:conversation_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/articles/{article_id}": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/categories/quizzes/{quiz_id}": {
"body": false,
"params": [
"path:quiz_id",
"query:category_id?"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/collections/{collection_id}": {
"body": true,
"params": [
"path:collection_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/drafts/batches/{batch_id}": {
"body": true,
"params": [
"path:batch_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/drafts/{draft_id}": {
"body": true,
"params": [
"path:draft_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/exams/{exam_id}": {
"body": true,
"params": [
"path:exam_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/feedback/articles/reports/{feedback_id}": {
"body": true,
"params": [
"path:feedback_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/feedback/{feedback_id}": {
"body": true,
"params": [
"path:feedback_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/flashcards/{deck_id}": {
"body": true,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/folders/{folder_id}": {
"body": true,
"params": [
"path:folder_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/media/{media_id}": {
"body": true,
"params": [
"path:media_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/question-categories/{cat_id}": {
"body": true,
"params": [
"path:cat_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/questions/figures/{figure_id}": {
"body": true,
"params": [
"path:figure_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/questions/{question_id}": {
"body": true,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/questions/{question_id}/category": {
"body": false,
"params": [
"path:question_id",
"query:category_id?"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/questions/{question_id}/restore": {
"body": false,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/quizzes/{quiz_id}": {
"body": true,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/quizzes/{quiz_id}/publish": {
"body": false,
"params": [
"path:quiz_id",
"query:published?"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/quizzes/{quiz_id}/questions/{question_id}": {
"body": true,
"params": [
"path:question_id",
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/quizzes/{quiz_id}/restore": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/quizzes/{quiz_id}/share": {
"body": false,
"params": [
"path:quiz_id",
"query:shared"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/study-plans/blocks/{block_id}": {
"body": true,
"params": [
"path:block_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/study-plans/{plan_id}": {
"body": true,
"params": [
"path:plan_id"
],
"responses": [
"200",
"422"
]
},
"PATCH /api/v1/tags/{tag_id}": {
"body": true,
"params": [
"path:tag_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/access/{user_id}/grants": {
"body": true,
"params": [
"path:user_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/admin/classification-snapshots/{snapshot_id}/rollback": {
"body": false,
"params": [
"path:snapshot_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/embedding/regenerate": {
"body": false,
"params": [
"query:stale_only?"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/embedding/test": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"POST /api/v1/admin/invites": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/admin/litellm/models": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/models": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/models/{model_id}/test": {
"body": false,
"params": [
"path:model_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/rerank/test": {
"body": false,
"params": [],
"responses": [
"200"
]
},
"POST /api/v1/admin/tts/voices": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/admin/users": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/ai/conversations": {
"body": false,
"params": [],
"responses": [
"201"
]
},
"POST /api/v1/ai/conversations/{conversation_id}/messages": {
"body": true,
"params": [
"path:conversation_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/ai/conversations/{conversation_id}/practice": {
"body": true,
"params": [
"path:conversation_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/ai-draft": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/ai-cards": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/ai-refine": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/links/from-category": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/publish": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/restore": {
"body": false,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/revisions/{revision_id}/restore": {
"body": false,
"params": [
"path:article_id",
"path:revision_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/articles/{article_id}/status": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/attempts/progress": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/attempts/reset-all": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/attempts/start": {
"body": false,
"params": [
"query:fresh?",
"query:mode?",
"query:quiz_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/attempts/{attempt_id}/submit": {
"body": true,
"params": [
"path:attempt_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/forgot-password": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/login": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/login-code": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/login-code/verify": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/logout": {
"body": true,
"params": [],
"responses": [
"204",
"422"
]
},
"POST /api/v1/auth/refresh": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/register": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/resend-verification": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/auth/reset-password": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/categories/": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/collections/": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/contact": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/documents/upload": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/documents/{document_id}/sections": {
"body": true,
"params": [
"path:document_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/drafts/accept": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/drafts/reject": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/drafts/{draft_id}/reopen": {
"body": false,
"params": [
"path:draft_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/exams/": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/exams/{exam_id}/assign": {
"body": true,
"params": [
"path:exam_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/favorites": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/feedback/articles/{article_id}": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/feedback/questions/{question_id}": {
"body": true,
"params": [
"path:question_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/flashcards/": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/flashcards/cards/{card_id}/review": {
"body": true,
"params": [
"path:card_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/flashcards/decks/{deck_id}/cards": {
"body": true,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/flashcards/{deck_id}/rate": {
"body": true,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/flashcards/{deck_id}/restore": {
"body": false,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/folders/": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/folders/{folder_id}/questions": {
"body": true,
"params": [
"path:folder_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/media/libraries": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/media/libraries/{library_id}/grants": {
"body": true,
"params": [
"path:library_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/media/upload": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/nextcloud/download": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/nextcloud/files": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/nextcloud/test": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/question-categories/": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/question-categories/{cat_id}/create-quiz": {
"body": false,
"params": [
"path:cat_id",
"query:count?",
"query:mode?",
"query:time_limit_minutes?",
"query:title"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/question-categories/{cat_id}/grants": {
"body": true,
"params": [
"path:cat_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/questions/builder": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/builder/describe": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/builder/from-upload": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/builder/prepared": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/bulk": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/bulk-category": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/create": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/detail/{question_id}/figures": {
"body": true,
"params": [
"path:question_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/questions/detail/{question_id}/versions/{version_id}/restore": {
"body": false,
"params": [
"path:question_id",
"path:version_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/from-bank": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/import/qti": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/import/upload": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/questions/upload-image": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/quizzes/": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/quizzes/job/{job_id}/cancel": {
"body": false,
"params": [
"path:job_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/quizzes/{quiz_id}/share-link": {
"body": false,
"params": [
"path:quiz_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/quizzes/{quiz_id}/shuffle": {
"body": false,
"params": [
"path:quiz_id",
"query:shuffle_options?"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/study-plans/": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/study-plans/blocks/{block_id}/articles": {
"body": true,
"params": [
"path:block_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/study-plans/blocks/{block_id}/move": {
"body": true,
"params": [
"path:block_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/study-plans/blocks/{block_id}/start": {
"body": false,
"params": [
"path:block_id",
"query:mode?"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/study-plans/from-blueprint": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/study-plans/reading/{link_id}/read": {
"body": false,
"params": [
"path:link_id",
"query:read?"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/study-plans/{plan_id}/blocks": {
"body": true,
"params": [
"path:plan_id"
],
"responses": [
"201",
"422"
]
},
"POST /api/v1/study-plans/{plan_id}/blocks/order": {
"body": true,
"params": [
"path:plan_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/study-tools/lab-values": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/tags/": {
"body": true,
"params": [],
"responses": [
"201",
"422"
]
},
"POST /api/v1/tags/{tag_id}/questions": {
"body": true,
"params": [
"path:tag_id"
],
"responses": [
"200",
"422"
]
},
"POST /api/v1/teach/chat": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/tts/speak": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"POST /api/v1/tts/transcribe": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/access/{user_id}/role": {
"body": true,
"params": [
"path:user_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/admin/models/{model_id}": {
"body": true,
"params": [
"path:model_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/admin/settings": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/admin/users/{user_id}/role": {
"body": true,
"params": [
"path:user_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/admin/users/{user_id}/unthrottle": {
"body": true,
"params": [
"path:user_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/articles/{article_id}/links": {
"body": true,
"params": [
"path:article_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/articles/{article_id}/notes/{section_id}": {
"body": true,
"params": [
"path:article_id",
"path:section_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/auth/me": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/auth/me/settings": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/collections/{collection_id}/articles/{article_id}": {
"body": false,
"params": [
"path:article_id",
"path:collection_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/collections/{collection_id}/questions/{question_id}": {
"body": false,
"params": [
"path:collection_id",
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/contact/submissions/{submission_id}/read": {
"body": false,
"params": [
"path:submission_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/exams/active": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/exams/{exam_id}/blueprint/{blueprint_id}/categories": {
"body": true,
"params": [
"path:blueprint_id",
"path:exam_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/flashcards/cards/{card_id}": {
"body": true,
"params": [
"path:card_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/flashcards/cards/{card_id}/links/article": {
"body": true,
"params": [
"path:card_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/flashcards/cards/{card_id}/links/question": {
"body": true,
"params": [
"path:card_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/flashcards/{deck_id}/share": {
"body": false,
"params": [
"path:deck_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/mynote": {
"body": true,
"params": [],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/questions/detail/{question_id}/note": {
"body": true,
"params": [
"path:question_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/study-tools/lab-values/{entry_id}": {
"body": true,
"params": [
"path:entry_id"
],
"responses": [
"200",
"422"
]
},
"PUT /api/v1/study-tools/lab-values/{entry_id}/cards/{card_id}": {
"body": false,
"params": [
"path:card_id",
"path:entry_id"
],
"responses": [
"200",
"422"
]
}
},
"version": "3.0.0"
}