Spaces:
Running
Running
| { | |
| "_meta": { | |
| "generated": "2026-04-08", | |
| "websockets": "none — no Mercure, Pusher, or WebSocket integration found in codebase" | |
| }, | |
| "endpoints": [ | |
| { | |
| "api_type": "form", | |
| "route_name": "login_check", | |
| "endpoint": "POST /login_check", | |
| "auth": "none", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "_username": { "type": "string", "source": "TASK_SPEC", "notes": "Login username" }, | |
| "_password": { "type": "string", "source": "TASK_SPEC", "notes": "Login password" }, | |
| "_remember_me": { "type": "checkbox", "source": "STATIC", "notes": "Optional; value 'on' to persist session" }, | |
| "_csrf_token": { "type": "string", "source": "AUTH_FLOW", "notes": "Extracted from login page HTML; token id = 'authenticate'" } | |
| }, | |
| "response_key_fields": ["Set-Cookie: PHPSESSID", "Set-Cookie: REMEMBERME"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "log_out", | |
| "endpoint": "GET /log_out", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token for logout; csrf_parameter name is 'token'" } | |
| }, | |
| "form_params": {}, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "registration", | |
| "endpoint": "POST /registration", | |
| "auth": "none", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "user_type[username]": { "type": "string", "source": "TASK_SPEC", "notes": "Username; 3-25 chars" }, | |
| "user_type[password][first]": { "type": "string", "source": "TASK_SPEC", "notes": "Password" }, | |
| "user_type[password][second]": { "type": "string", "source": "TASK_SPEC", "notes": "Repeat password" }, | |
| "user_type[email]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional email" }, | |
| "user_type[phone]": { "type": "string", "source": "STATIC", "notes": "Honeypot — must be left empty" }, | |
| "user_type[verification]": { "type": "string", "source": "AUTH_FLOW", "notes": "Captcha answer if registration captcha enabled" }, | |
| "user_type[_token]": { "type": "string", "source": "AUTH_FLOW", "notes": "Symfony CSRF token extracted from form HTML" } | |
| }, | |
| "response_key_fields": ["redirect to login link on success"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submit", | |
| "endpoint": "POST /submit/{forum_name}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC", "notes": "Optional; forum slug; can be omitted to pre-select from form field" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "submission[title]": { "type": "string", "source": "TASK_SPEC", "notes": "Post title; max 300 chars" }, | |
| "submission[url]": { "type": "string", "source": "TASK_SPEC", "notes": "URL for link posts; optional" }, | |
| "submission[body]": { "type": "markdown", "source": "TASK_SPEC", "notes": "Post body; optional" }, | |
| "submission[mediaType]": { "type": "string", "source": "STATIC", "notes": "One of: url, image; only present if user can upload images" }, | |
| "submission[image]": { "type": "file", "source": "TASK_SPEC", "notes": "Image file if mediaType=image; multipart/form-data required" }, | |
| "submission[forum]": { "type": "string", "source": "TASK_SPEC", "notes": "Forum name if not in path" }, | |
| "submission[userFlag]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional user/mod flair flag" }, | |
| "submission[email]": { "type": "string", "source": "STATIC", "notes": "Honeypot — must be left empty" }, | |
| "submission[_token]": { "type": "string", "source": "AUTH_FLOW", "notes": "Symfony CSRF token from form HTML" } | |
| }, | |
| "response_key_fields": ["redirect to /f/{forum_name}/{submission_id}/{slug} on success"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "edit_submission", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/edit", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL", "from_endpoint": "submit", "from_field": "forum_name" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL", "from_endpoint": "submit", "from_field": "submission_id" }, | |
| "slug": { "type": "string", "source": "PREV_CALL", "from_endpoint": "submit", "from_field": "slug", "notes": "Can be '-' as placeholder" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "submission[title]": { "type": "string", "source": "TASK_SPEC" }, | |
| "submission[url]": { "type": "string", "source": "TASK_SPEC", "notes": "Only for url-type submissions" }, | |
| "submission[body]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "submission[userFlag]": { "type": "string", "source": "TASK_SPEC" }, | |
| "submission[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_delete_own", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL", "notes": "Can be '-'" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'delete_submission'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_mod_delete", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/mod_delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "delete_reason[reason]": { "type": "string", "source": "TASK_SPEC", "notes": "Moderator deletion reason" }, | |
| "delete_reason[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_purge", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/purge", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'purge_submission'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_restore", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/restore", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'restore_submission'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "lock", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/lock", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'lock'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unlock", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/unlock", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'lock'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "pin", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/pin", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'pin'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unpin", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/unpin", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'pin'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_flair", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/flair", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "custom_text_flair[text]": { "type": "string", "source": "TASK_SPEC", "notes": "Flair text to apply" }, | |
| "custom_text_flair[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_remove_flairs", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/remove_flairs", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "id[]": { "type": "uuid[]", "source": "PREV_CALL", "notes": "Array of flair UUIDs to remove" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'remove_flair'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "submission_vote", | |
| "endpoint": "POST /sv/{id}.{_format}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL", "from_endpoint": "submit or submission list", "from_field": "submission_id" }, | |
| "_format": { "type": "string", "source": "STATIC", "notes": "html or json; use json for AJAX" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "choice": { "type": "integer", "source": "STATIC", "notes": "1 = upvote, -1 = downvote, 0 = retract" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'vote'" } | |
| }, | |
| "response_key_fields": ["netScore"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_post", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL", "notes": "Can be '-'" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL", "notes": "Parent comment ID for reply; omit/null for top-level reply to submission" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "reply_to_submission_{submissionId}[comment]": { "type": "markdown", "source": "TASK_SPEC", "notes": "Form name is 'reply_to_submission_{id}' for top-level, 'reply_to_comment_{id}' for replies; field path 'body'" }, | |
| "reply_to_submission_{submissionId}[userFlag]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional flair flag" }, | |
| "reply_to_submission_{submissionId}[email]": { "type": "string", "source": "STATIC", "notes": "Honeypot — must be left empty" }, | |
| "reply_to_submission_{submissionId}[_token]": { "type": "string", "source": "AUTH_FLOW", "notes": "Symfony CSRF token" } | |
| }, | |
| "response_key_fields": ["redirect to comment anchor on success"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "edit_comment", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/edit", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "comment[comment]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "comment[userFlag]": { "type": "string", "source": "TASK_SPEC" }, | |
| "comment[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_delete_own", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/delete_own", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'delete_own_comment'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_delete", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "delete_reason[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "delete_reason[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_delete_thread", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/delete_thread", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "delete_reason[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "delete_reason[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_purge", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/purge", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'purge_comment'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_restore", | |
| "endpoint": "POST /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}/restore", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'restore_comment'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "comment_vote", | |
| "endpoint": "POST /cv/{id}.{_format}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL", "notes": "Comment ID" }, | |
| "_format": { "type": "string", "source": "STATIC", "notes": "html or json" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "choice": { "type": "integer", "source": "STATIC", "notes": "1 = upvote, -1 = downvote, 0 = retract" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'vote'" } | |
| }, | |
| "response_key_fields": ["netScore"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "create_forum", | |
| "endpoint": "POST /create_forum", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum[name]": { "type": "string", "source": "TASK_SPEC", "notes": "Forum slug; 3-25 chars" }, | |
| "forum[title]": { "type": "string", "source": "TASK_SPEC", "notes": "Forum display title" }, | |
| "forum[description]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum[sidebar]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "forum[tags]": { "type": "string[]", "source": "TASK_SPEC", "notes": "Array of tag names" }, | |
| "forum[moderationLogPublic]": { "type": "checkbox", "source": "TASK_SPEC", "notes": "Admins/mods only" }, | |
| "forum[featured]": { "type": "checkbox", "source": "TASK_SPEC", "notes": "ROLE_ADMIN only" }, | |
| "forum[email]": { "type": "string", "source": "STATIC", "notes": "Honeypot — must be left empty" }, | |
| "forum[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": ["redirect to /f/{forum_name}"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "edit_forum", | |
| "endpoint": "POST /f/{forum_name}/edit", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum[name]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum[title]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum[description]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum[sidebar]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "forum[tags]": { "type": "string[]", "source": "TASK_SPEC" }, | |
| "forum[moderationLogPublic]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "forum[featured]": { "type": "checkbox", "source": "TASK_SPEC", "notes": "ROLE_ADMIN only" }, | |
| "forum[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "delete_forum", | |
| "endpoint": "POST /f/{forum_name}/delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "confirm_deletion[name]": { "type": "string", "source": "DERIVED", "notes": "Must equal the forum name exactly" }, | |
| "confirm_deletion[confirm]": { "type": "checkbox", "source": "STATIC", "notes": "Must be checked" }, | |
| "confirm_deletion[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "forum_appearance", | |
| "endpoint": "POST /f/{forum_name}/appearance", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "multipart/form-data", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum_appearance[suggestedTheme]": { "type": "string", "source": "TASK_SPEC", "notes": "Theme UUID or empty" }, | |
| "forum_appearance[backgroundImage]": { "type": "file", "source": "TASK_SPEC", "notes": "Image file; only if user can upload images" }, | |
| "forum_appearance[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "subscribe", | |
| "endpoint": "POST /f/{forum_name}/subscribe.{_format}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" }, | |
| "_format": { "type": "string", "source": "STATIC", "notes": "html or json" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'subscribe'" } | |
| }, | |
| "response_key_fields": ["subscribed"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unsubscribe", | |
| "endpoint": "POST /f/{forum_name}/unsubscribe.{_format}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" }, | |
| "_format": { "type": "string", "source": "STATIC", "notes": "html or json" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'subscribe'" } | |
| }, | |
| "response_key_fields": ["subscribed"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "add_moderator", | |
| "endpoint": "POST /f/{forum_name}/add_moderator", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "moderator[user]": { "type": "string", "source": "TASK_SPEC", "notes": "Username to add as moderator" }, | |
| "moderator[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "remove_moderator", | |
| "endpoint": "POST /f/{forum_name}/remove_moderator/{moderator_id}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" }, | |
| "moderator_id": { "type": "uuid", "source": "PREV_CALL", "notes": "Moderator record UUID from moderators list" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'remove_moderator'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "forum_ban", | |
| "endpoint": "POST /f/{forum_name}/ban/{username}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" }, | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum_ban[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum_ban[expires][date]": { "type": "date", "source": "TASK_SPEC", "notes": "Optional expiry date; format YYYY-MM-DD" }, | |
| "forum_ban[expires][time]": { "type": "time", "source": "TASK_SPEC", "notes": "Optional expiry time; format HH:MM" }, | |
| "forum_ban[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "forum_unban", | |
| "endpoint": "POST /f/{forum_name}/unban/{username}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "TASK_SPEC" }, | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum_ban[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum_ban[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "forum_tag_edit", | |
| "endpoint": "POST /tag/{name}/edit", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "forum_tag[name]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum_tag[description]": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum_tag[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "compose_message", | |
| "endpoint": "POST /user/{username}/compose_message", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC", "notes": "Recipient username" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "message[body]": { "type": "string", "source": "TASK_SPEC" }, | |
| "message[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": ["redirect to /messages/thread/{id}; thread id from redirect"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "reply_to_message", | |
| "endpoint": "POST /message_reply/{id}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL", "from_endpoint": "compose_message", "notes": "Thread ID" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "message[body]": { "type": "string", "source": "TASK_SPEC" }, | |
| "message[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "delete_message", | |
| "endpoint": "POST /messages/message/{id}/delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "uuid", "source": "PREV_CALL", "notes": "Message UUID" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'delete_message'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "request_password_reset", | |
| "endpoint": "POST /reset_password", | |
| "auth": "none", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "request_password_reset[email]": { "type": "string", "source": "TASK_SPEC" }, | |
| "request_password_reset[verification]": { "type": "string", "source": "AUTH_FLOW", "notes": "Captcha answer" }, | |
| "request_password_reset[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "password_reset", | |
| "endpoint": "POST /reset_password/{id}/{expires}/{checksum}", | |
| "auth": "none", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "AUTH_FLOW", "notes": "User ID from reset email link" }, | |
| "expires": { "type": "integer", "source": "AUTH_FLOW", "notes": "Unix timestamp from reset email link" }, | |
| "checksum": { "type": "string", "source": "AUTH_FLOW", "notes": "HMAC checksum from reset email link" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "user[username]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user[password][first]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user[password][second]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user[email]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional" }, | |
| "user[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "edit_user", | |
| "endpoint": "POST /user/{username}/account", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW", "notes": "Must match authenticated user or admin" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "user[username]": { "type": "string", "source": "TASK_SPEC", "notes": "May be disabled if username change not allowed" }, | |
| "user[password][first]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional; leave blank to keep current" }, | |
| "user[password][second]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user[email]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional" }, | |
| "user[phone]": { "type": "string", "source": "STATIC", "notes": "Honeypot — must be left empty" }, | |
| "user[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "user_settings", | |
| "endpoint": "POST /user/{username}/preferences", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "user_settings[locale]": { "type": "string", "source": "TASK_SPEC", "notes": "BCP47 locale code" }, | |
| "user_settings[frontPage]": { "type": "string", "source": "TASK_SPEC", "notes": "featured|subscribed|all|moderated" }, | |
| "user_settings[frontPageSortMode]": { "type": "string", "source": "TASK_SPEC", "notes": "hot|new|active" }, | |
| "user_settings[openExternalLinksInNewTab]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[autoFetchSubmissionTitles]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[enablePostPreviews]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[showThumbnails]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[notifyOnReply]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[notifyOnMentions]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[allowPrivateMessages]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[preferredFonts]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user_settings[nightMode]": { "type": "string", "source": "TASK_SPEC", "notes": "0=auto, 1=light, 2=dark" }, | |
| "user_settings[preferredTheme]": { "type": "string", "source": "TASK_SPEC", "notes": "Theme UUID" }, | |
| "user_settings[showCustomStylesheets]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[poppersEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[fullWidthDisplayEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "user_settings[submissionLinkDestination]": { "type": "string", "source": "TASK_SPEC" }, | |
| "user_settings[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "edit_biography", | |
| "endpoint": "POST /user/{username}/edit_biography", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "user_biography[biography]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "user_biography[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "delete_account", | |
| "endpoint": "POST /user/{username}/delete_account", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "confirm_deletion[name]": { "type": "string", "source": "DERIVED", "notes": "Must equal the username exactly" }, | |
| "confirm_deletion[confirm]": { "type": "checkbox", "source": "STATIC" }, | |
| "confirm_deletion[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "block_user", | |
| "endpoint": "POST /user/{username}/block_user", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC", "notes": "User to block" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "user_block[comment]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional private note about block" }, | |
| "user_block[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unblock_user", | |
| "endpoint": "POST /user/{username}/unblock_user", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'unblock'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "clear_notifications", | |
| "endpoint": "POST /clear_notifications", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "id[]": { "type": "uuid[]", "source": "PREV_CALL", "notes": "Array of notification UUIDs to clear; omit to clear all" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'clear_notifications'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "user_whitelist", | |
| "endpoint": "POST /user/{username}/whitelist", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'whitelist'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "user_dewhitelist", | |
| "endpoint": "POST /user/{username}/dewhitelist", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'whitelist'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "hide_forum", | |
| "endpoint": "POST /user/{username}/hide_forum/{forum}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW" }, | |
| "forum": { "type": "string", "source": "TASK_SPEC", "notes": "Forum name" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'hide_forum'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unhide_forum", | |
| "endpoint": "POST /user/{username}/unhide_forum/{forum}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "AUTH_FLOW" }, | |
| "forum": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'hide_forum'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "change_night_mode", | |
| "endpoint": "POST /night_mode.{_format}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "_format": { "type": "string", "source": "STATIC", "notes": "html or json" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "nightMode": { "type": "string", "source": "TASK_SPEC", "notes": "0=auto, 1=light, 2=dark" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'night_mode'" } | |
| }, | |
| "response_key_fields": ["nightMode"] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "ban_user", | |
| "endpoint": "POST /bans/ban_user/{username}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "ban_user[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "ban_user[expires][date]": { "type": "date", "source": "TASK_SPEC", "notes": "Optional; YYYY-MM-DD" }, | |
| "ban_user[expires][time]": { "type": "time", "source": "TASK_SPEC", "notes": "Optional; HH:MM" }, | |
| "ban_user[ban_ip]": { "type": "checkbox", "source": "TASK_SPEC", "notes": "Also ban associated IPs" }, | |
| "ban_user[ips]": { "type": "string", "source": "DERIVED", "notes": "Comma/newline-separated IP list; auto-populated from user history" }, | |
| "ban_user[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unban_user", | |
| "endpoint": "POST /bans/unban_user/{username}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "unban_user[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "unban_user[unban_ips]": { "type": "checkbox", "source": "TASK_SPEC", "notes": "Also lift associated IP bans" }, | |
| "unban_user[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "ban_ip", | |
| "endpoint": "POST /bans/ban_ip", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "ip_ban[ip]": { "type": "string", "source": "TASK_SPEC", "notes": "IP address to ban" }, | |
| "ip_ban[reason]": { "type": "string", "source": "TASK_SPEC" }, | |
| "ip_ban[expires][date]": { "type": "date", "source": "TASK_SPEC", "notes": "Optional" }, | |
| "ip_ban[expires][time]": { "type": "time", "source": "TASK_SPEC", "notes": "Optional" }, | |
| "ip_ban[user]": { "type": "string", "source": "TASK_SPEC", "notes": "Optional; username associated with this IP" }, | |
| "ip_ban[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "unban_ips", | |
| "endpoint": "POST /bans/unban_ips", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "ban[]": { "type": "integer[]", "source": "PREV_CALL", "notes": "Array of IP ban IDs to remove" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'unban_ips'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "bad_phrase_add", | |
| "endpoint": "POST /site/bad_phrases/add", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "bad_phrase[phrase]": { "type": "string", "source": "TASK_SPEC" }, | |
| "bad_phrase[phraseType]": { "type": "string", "source": "STATIC", "notes": "text or regex" }, | |
| "bad_phrase[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "bad_phrase_remove", | |
| "endpoint": "POST /site/bad_phrases/remove", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "remove_bad_phrase[]": { "type": "uuid[]", "source": "PREV_CALL", "notes": "Array of bad phrase UUIDs to remove" }, | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'remove_bad_phrase'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "site_settings", | |
| "endpoint": "POST /site/settings", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "site_settings[siteName]": { "type": "string", "source": "TASK_SPEC" }, | |
| "site_settings[registrationOpen]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[usernameChangeEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[unwhitelistedUserMessagesEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[defaultSortMode]": { "type": "string", "source": "TASK_SPEC", "notes": "hot|active|new" }, | |
| "site_settings[defaultTheme]": { "type": "string", "source": "TASK_SPEC", "notes": "Theme UUID or empty" }, | |
| "site_settings[urlImagesEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[trashEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[wikiEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[wikiLogPublic]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[forumCreateRole]": { "type": "string", "source": "TASK_SPEC", "notes": "ROLE_ADMIN|ROLE_WHITELISTED|ROLE_USER" }, | |
| "site_settings[moderatorsCanSetForumLogVisibility]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[imageUploadRole]": { "type": "string", "source": "TASK_SPEC" }, | |
| "site_settings[wikiEditRole]": { "type": "string", "source": "TASK_SPEC" }, | |
| "site_settings[registrationCaptchaEnabled]": { "type": "checkbox", "source": "TASK_SPEC" }, | |
| "site_settings[submissionLinkDestination]": { "type": "string", "source": "TASK_SPEC" }, | |
| "site_settings[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "theme_create_css", | |
| "endpoint": "POST /site/themes/css/create", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "css_theme[name]": { "type": "string", "source": "TASK_SPEC" }, | |
| "css_theme[css]": { "type": "string", "source": "TASK_SPEC" }, | |
| "css_theme[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "theme_edit_css", | |
| "endpoint": "POST /site/themes/css/{id}/edit", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "uuid", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "css_theme[name]": { "type": "string", "source": "TASK_SPEC" }, | |
| "css_theme[css]": { "type": "string", "source": "TASK_SPEC" }, | |
| "css_theme[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "theme_delete", | |
| "endpoint": "POST /site/themes/{id}/delete", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "id": { "type": "uuid", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'delete_theme'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "theme_sync", | |
| "endpoint": "POST /site/themes/sync", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'sync_themes'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "wiki_create", | |
| "endpoint": "POST /wiki/_create/{path}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "path": { "type": "string", "source": "TASK_SPEC", "notes": "Wiki page path; can be empty to enter in form" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "wiki[path]": { "type": "string", "source": "TASK_SPEC", "notes": "Only present when path is empty" }, | |
| "wiki[title]": { "type": "string", "source": "TASK_SPEC" }, | |
| "wiki[body]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "wiki[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "wiki_edit", | |
| "endpoint": "POST /wiki/_edit/{path}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "path": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "wiki[title]": { "type": "string", "source": "TASK_SPEC" }, | |
| "wiki[body]": { "type": "markdown", "source": "TASK_SPEC" }, | |
| "wiki[_token]": { "type": "string", "source": "AUTH_FLOW" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "wiki_delete", | |
| "endpoint": "POST /wiki/_delete/{path}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "path": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'wiki_delete'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "wiki_lock", | |
| "endpoint": "POST /wiki/_lock/{path}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "path": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'wiki_lock'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "form", | |
| "route_name": "wiki_unlock", | |
| "endpoint": "POST /wiki/_unlock/{path}", | |
| "auth": "session_cookie+csrf", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": { | |
| "path": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "form_params": { | |
| "token": { "type": "string", "source": "AUTH_FLOW", "notes": "CSRF token id = 'wiki_lock'" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "fetch_title", | |
| "endpoint": "POST /ft.json", | |
| "auth": "session_cookie", | |
| "content_type": "application/x-www-form-urlencoded", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "form_params": { | |
| "url": { "type": "string", "source": "TASK_SPEC", "notes": "URL whose title to fetch; must be a valid URL" } | |
| }, | |
| "body_params": {}, | |
| "response_key_fields": ["title"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "user_popper", | |
| "endpoint": "GET /_up/{username}", | |
| "auth": "none", | |
| "content_type": "none", | |
| "path_params": { | |
| "username": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["HTML fragment for user popover"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "comment_json", | |
| "endpoint": "GET /f/{forum_name}/{submission_id}/{slug}/comment/{comment_id}.json", | |
| "auth": "session_cookie", | |
| "content_type": "none", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" }, | |
| "slug": { "type": "string", "source": "PREV_CALL" }, | |
| "comment_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "body", "author", "created_at", "net_score", "visibility"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "submission_json", | |
| "endpoint": "GET /f/{forum_name}/{submission_id}.json", | |
| "auth": "session_cookie", | |
| "content_type": "none", | |
| "path_params": { | |
| "forum_name": { "type": "string", "source": "PREV_CALL" }, | |
| "submission_id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "title", "url", "body", "author", "forum", "created_at", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_comments_list", | |
| "endpoint": "GET /api/comments", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "body", "author", "submission", "created_at", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_comment_read", | |
| "endpoint": "GET /api/comments/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "body", "author", "submission", "created_at", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_comment_update", | |
| "endpoint": "PUT /api/comments/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": { | |
| "body": { "type": "string", "source": "TASK_SPEC", "notes": "Comment body markdown; denormalization group: comment:update" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_forum_read", | |
| "endpoint": "GET /api/forums/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "name", "title", "description", "sidebar", "created_at", "subscriber_count"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_forum_read_by_name", | |
| "endpoint": "GET /api/forums/by_name/{name}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "name": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "name", "title", "description", "sidebar", "created_at", "subscriber_count"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_forum_create", | |
| "endpoint": "POST /api/forums", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "body_params": { | |
| "name": { "type": "string", "source": "TASK_SPEC", "notes": "Forum slug; denormalization group: forum:create" }, | |
| "title": { "type": "string", "source": "TASK_SPEC" }, | |
| "description": { "type": "string", "source": "TASK_SPEC" }, | |
| "sidebar": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "response_key_fields": ["id", "name"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_forum_update", | |
| "endpoint": "PUT /api/forums/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": { | |
| "title": { "type": "string", "source": "TASK_SPEC", "notes": "denormalization group: forum:update" }, | |
| "description": { "type": "string", "source": "TASK_SPEC" }, | |
| "sidebar": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submissions_list", | |
| "endpoint": "GET /api/submissions", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": {}, | |
| "query_params": { | |
| "sortBy": { "type": "string", "source": "TASK_SPEC", "notes": "hot|new|active; defaults to user preference" }, | |
| "filter": { "type": "string", "source": "TASK_SPEC", "notes": "featured|subscribed|moderated|all; defaults to user preference" } | |
| }, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "title", "url", "body", "forum", "author", "created_at", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submission_read", | |
| "endpoint": "GET /api/submissions/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "title", "url", "body", "forum", "author", "created_at", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submission_create", | |
| "endpoint": "POST /api/submissions", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "body_params": { | |
| "title": { "type": "string", "source": "TASK_SPEC", "notes": "denormalization group: submission:create" }, | |
| "url": { "type": "string", "source": "TASK_SPEC" }, | |
| "body": { "type": "string", "source": "TASK_SPEC" }, | |
| "forum": { "type": "string|integer", "source": "TASK_SPEC", "notes": "Forum name or ID" }, | |
| "mediaType": { "type": "string", "source": "STATIC", "notes": "url|image" } | |
| }, | |
| "response_key_fields": ["id", "forum", "title"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submission_update", | |
| "endpoint": "PUT /api/submissions/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": { | |
| "title": { "type": "string", "source": "TASK_SPEC", "notes": "denormalization group: submission:update" }, | |
| "url": { "type": "string", "source": "TASK_SPEC" }, | |
| "body": { "type": "string", "source": "TASK_SPEC" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submission_delete", | |
| "endpoint": "DELETE /api/submissions/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_submission_comments", | |
| "endpoint": "GET /api/submissions/{id}/comments", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "body", "author", "net_score", "replies"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_read", | |
| "endpoint": "GET /api/users/{id}", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "username", "created_at"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_self", | |
| "endpoint": "GET /api/users/self", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": {}, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "username"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_read_preferences", | |
| "endpoint": "GET /api/users/{id}/preferences", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["locale", "front_page", "front_page_sort_mode", "night_mode", "notify_on_reply"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_update_preferences", | |
| "endpoint": "PUT /api/users/{id}/preferences", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": { | |
| "locale": { "type": "string", "source": "TASK_SPEC", "notes": "denormalization group: user:preferences" }, | |
| "front_page": { "type": "string", "source": "TASK_SPEC" }, | |
| "front_page_sort_mode": { "type": "string", "source": "TASK_SPEC" }, | |
| "night_mode": { "type": "integer", "source": "TASK_SPEC" }, | |
| "notify_on_reply": { "type": "boolean", "source": "TASK_SPEC" }, | |
| "notify_on_mentions": { "type": "boolean", "source": "TASK_SPEC" } | |
| }, | |
| "response_key_fields": [] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_submissions", | |
| "endpoint": "GET /api/users/{id}/submissions", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["id", "title", "forum", "net_score"] | |
| }, | |
| { | |
| "api_type": "rest", | |
| "route_name": "api_user_moderator_of", | |
| "endpoint": "GET /api/users/{id}/moderator_of", | |
| "auth": "session_cookie", | |
| "content_type": "application/json", | |
| "path_params": { | |
| "id": { "type": "integer", "source": "PREV_CALL" } | |
| }, | |
| "query_params": {}, | |
| "body_params": {}, | |
| "response_key_fields": ["entries[].forum", "entries[].user"] | |
| } | |
| ] | |
| } | |