{"files":{"SKILL.md":"---\nname: discourse-api-documentation\ndescription: \"Discourse API Documentation API skill. Use when working with Discourse API Documentation for discourse-post-event, admin, categories.json. Covers 93 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Discourse API Documentation\nAPI version: latest\n\n## Auth\nApiKey token in query\n\n## Base URL\nhttps://discourse.example.com\n\n## Setup\n1. Set your API key in the appropriate header\n2. GET /discourse-post-event/events.json -- list calendar events\n3. POST /admin/backups.json -- create first backups.json\n\n## Endpoints\n93 endpoints across 35 groups. See references/api-spec.lap for full details.\n\n### Discourse-post-event\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /discourse-post-event/events.json | List calendar events |\n| GET | /discourse-post-event/events.ics | Export calendar events in iCalendar format |\n\n### Admin\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /admin/backups.json | List backups |\n| POST | /admin/backups.json | Create backup |\n| PUT | /admin/backups/{filename} | Send download backup email |\n| GET | /admin/backups/{filename} | Download backup |\n| GET | /admin/badges.json | List badges |\n| POST | /admin/badges.json | Create badge |\n| PUT | /admin/badges/{id}.json | Update badge |\n| DELETE | /admin/badges/{id}.json | Delete badge |\n| POST | /admin/groups.json | Create a group |\n| DELETE | /admin/groups/{id}.json | Delete a group |\n| GET | /admin/users/{id}.json | Get a user by id |\n| DELETE | /admin/users/{id}.json | Delete a user |\n| PUT | /admin/users/{id}/activate.json | Activate a user |\n| PUT | /admin/users/{id}/deactivate.json | Deactivate a user |\n| PUT | /admin/users/{id}/suspend.json | Suspend a user |\n| PUT | /admin/users/{id}/silence.json | Silence a user |\n| PUT | /admin/users/{id}/anonymize.json | Anonymize a user |\n| POST | /admin/users/{id}/log_out.json | Log a user out |\n| GET | /admin/users.json | List users |\n| GET | /admin/users/list/{flag}.json | List users by flag |\n\n### Categories.json\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /categories.json | Creates a category |\n| GET | /categories.json | Retrieves a list of categories |\n\n### Categories\n| Method | Path | Description |\n|--------|------|-------------|\n| PUT | /categories/{id}.json | Updates a category |\n\n### C\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /c/{slug}/{id}.json | List topics |\n| GET | /c/{id}/show.json | Show category |\n\n### Groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /groups/{name}.json | Get a group |\n| PUT | /groups/{id}.json | Update a group |\n| GET | /groups/by-id/{id}.json | Get a group by id |\n| GET | /groups/{name}/members.json | List group members |\n| PUT | /groups/{id}/members.json | Add group members |\n| DELETE | /groups/{id}/members.json | Remove group members |\n\n### Groups.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /groups.json | List groups |\n\n### Invites.json\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /invites.json | Create an invite |\n\n### Invites\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /invites/create-multiple.json | Create multiple invites |\n\n### Notifications.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notifications.json | Get the notifications that belong to the current user |\n\n### Notifications\n| Method | Path | Description |\n|--------|------|-------------|\n| PUT | /notifications/mark-read.json | Mark notifications as read |\n\n### Posts.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /posts.json | List latest posts across topics |\n| POST | /posts.json | Creates a new topic, a new post, or a private message |\n\n### Posts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /posts/{id}.json | Retrieve a single post |\n| PUT | /posts/{id}.json | Update a single post |\n| DELETE | /posts/{id}.json | delete a single post |\n| GET | /posts/{id}/replies.json | List replies to a post |\n| PUT | /posts/{id}/locked.json | Lock a post from being edited |\n\n### Post_actions.json\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /post_actions.json | Like a post and other actions |\n\n### Topics\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /topics/private-messages/{username}.json | Get a list of private messages for a user |\n| GET | /topics/private-messages-sent/{username}.json | Get a list of private messages sent for a user |\n\n### Search.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /search.json | Search for a term |\n\n### Site.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /site.json | Get site info |\n\n### Site\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /site/basic-info.json | Get site basic info |\n\n### Tag_groups.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tag_groups.json | Get a list of tag groups |\n| POST | /tag_groups.json | Creates a tag group |\n\n### Tag_groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tag_groups/{id}.json | Get a single tag group |\n| PUT | /tag_groups/{id}.json | Update tag group |\n\n### Tags.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tags.json | Get a list of tags |\n\n### Tag\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tag/{name}.json | Get a specific tag |\n\n### T\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /t/{id}/posts.json | Get specific posts from a topic |\n| GET | /t/{id}.json | Get a single topic |\n| DELETE | /t/{id}.json | Remove a topic |\n| PUT | /t/-/{id}.json | Update a topic |\n| POST | /t/{id}/invite.json | Invite to topic |\n| POST | /t/{id}/invite-group.json | Invite group to topic |\n| PUT | /t/{id}/bookmark.json | Bookmark topic |\n| PUT | /t/{id}/status.json | Update the status of a topic |\n| POST | /t/{id}/notifications.json | Set notification level |\n| PUT | /t/{id}/change-timestamp.json | Update topic timestamp |\n| POST | /t/{id}/timer.json | Create topic timer |\n| GET | /t/external_id/{external_id}.json | Get topic by external_id |\n\n### Latest.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /latest.json | Get the latest topics |\n\n### Top.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /top.json | Get the top topics filtered by period |\n\n### Uploads.json\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /uploads.json | Creates an upload |\n\n### Uploads\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /uploads/generate-presigned-put.json | Initiates a direct external upload |\n| POST | /uploads/complete-external-upload.json | Completes a direct external upload |\n| POST | /uploads/create-multipart.json | Creates a multipart external upload |\n| POST | /uploads/batch-presign-multipart-parts.json | Generates batches of presigned URLs for multipart parts |\n| POST | /uploads/abort-multipart.json | Abort multipart upload |\n| POST | /uploads/complete-multipart.json | Complete multipart upload |\n\n### User-badges\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /user-badges/{username}.json | List badges for a user |\n\n### Users.json\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /users.json | Creates a user |\n\n### U\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /u/{username}.json | Get a single user by username |\n| PUT | /u/{username}.json | Update a user |\n| GET | /u/by-external/{external_id}.json | Get a user by external_id |\n| GET | /u/by-external/{provider}/{external_id}.json | Get a user by identity provider external ID |\n| PUT | /u/{username}/preferences/avatar/pick.json | Update avatar |\n| PUT | /u/{username}/preferences/email.json | Update email |\n| PUT | /u/{username}/preferences/username.json | Update username |\n| GET | /u/{username}/emails.json | Get email addresses belonging to a user |\n\n### Directory_items.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /directory_items.json | Get a public list of users |\n\n### User_avatar\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /user_avatar/{username}/refresh_gravatar.json | Refresh gravatar |\n\n### User_actions.json\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /user_actions.json | Get a list of user actions |\n\n### Session\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /session/forgot_password.json | Send password reset email |\n\n### Users\n| Method | Path | Description |\n|--------|------|-------------|\n| PUT | /users/password-reset/{token}.json | Change password |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all events.json?\" -> GET /discourse-post-event/events.json\n- \"List all events.ics?\" -> GET /discourse-post-event/events.ics\n- \"List all backups.json?\" -> GET /admin/backups.json\n- \"Create a backups.json?\" -> POST /admin/backups.json\n- \"Update a backup?\" -> PUT /admin/backups/{filename}\n- \"Get backup details?\" -> GET /admin/backups/{filename}\n- \"List all badges.json?\" -> GET /admin/badges.json\n- \"Create a badges.json?\" -> POST /admin/badges.json\n- \"Update a badge?\" -> PUT /admin/badges/{id}.json\n- \"Delete a badge?\" -> DELETE /admin/badges/{id}.json\n- \"Create a categories.json?\" -> POST /categories.json\n- \"List all categories.json?\" -> GET /categories.json\n- \"Update a category?\" -> PUT /categories/{id}.json\n- \"Get c details?\" -> GET /c/{slug}/{id}.json\n- \"List all show.json?\" -> GET /c/{id}/show.json\n- \"Create a groups.json?\" -> POST /admin/groups.json\n- \"Delete a group?\" -> DELETE /admin/groups/{id}.json\n- \"Get group details?\" -> GET /groups/{name}.json\n- \"Update a group?\" -> PUT /groups/{id}.json\n- \"Get by-id details?\" -> GET /groups/by-id/{id}.json\n- \"List all members.json?\" -> GET /groups/{name}/members.json\n- \"List all groups.json?\" -> GET /groups.json\n- \"Create a invites.json?\" -> POST /invites.json\n- \"Create a create-multiple.json?\" -> POST /invites/create-multiple.json\n- \"List all notifications.json?\" -> GET /notifications.json\n- \"List all posts.json?\" -> GET /posts.json\n- \"Create a posts.json?\" -> POST /posts.json\n- \"Get post details?\" -> GET /posts/{id}.json\n- \"Update a post?\" -> PUT /posts/{id}.json\n- \"Delete a post?\" -> DELETE /posts/{id}.json\n- \"List all replies.json?\" -> GET /posts/{id}/replies.json\n- \"Create a post_actions.json?\" -> POST /post_actions.json\n- \"Get private-message details?\" -> GET /topics/private-messages/{username}.json\n- \"Get private-messages-sent details?\" -> GET /topics/private-messages-sent/{username}.json\n- \"Search search.json?\" -> GET /search.json\n- \"List all site.json?\" -> GET /site.json\n- \"List all basic-info.json?\" -> GET /site/basic-info.json\n- \"List all tag_groups.json?\" -> GET /tag_groups.json\n- \"Create a tag_groups.json?\" -> POST /tag_groups.json\n- \"Get tag_group details?\" -> GET /tag_groups/{id}.json\n- \"Update a tag_group?\" -> PUT /tag_groups/{id}.json\n- \"List all tags.json?\" -> GET /tags.json\n- \"Get tag details?\" -> GET /tag/{name}.json\n- \"Get t details?\" -> GET /t/{id}.json\n- \"Delete a t?\" -> DELETE /t/{id}.json\n- \"Update a -?\" -> PUT /t/-/{id}.json\n- \"Create a invite.json?\" -> POST /t/{id}/invite.json\n- \"Create a invite-group.json?\" -> POST /t/{id}/invite-group.json\n- \"List all latest.json?\" -> GET /latest.json\n- \"List all top.json?\" -> GET /top.json\n- \"Create a notifications.json?\" -> POST /t/{id}/notifications.json\n- \"Create a timer.json?\" -> POST /t/{id}/timer.json\n- \"Get external_id details?\" -> GET /t/external_id/{external_id}.json\n- \"Create a uploads.json?\" -> POST /uploads.json\n- \"Create a generate-presigned-put.json?\" -> POST /uploads/generate-presigned-put.json\n- \"Create a complete-external-upload.json?\" -> POST /uploads/complete-external-upload.json\n- \"Create a create-multipart.json?\" -> POST /uploads/create-multipart.json\n- \"Create a batch-presign-multipart-parts.json?\" -> POST /uploads/batch-presign-multipart-parts.json\n- \"Create a abort-multipart.json?\" -> POST /uploads/abort-multipart.json\n- \"Create a complete-multipart.json?\" -> POST /uploads/complete-multipart.json\n- \"Get user-badge details?\" -> GET /user-badges/{username}.json\n- \"Create a users.json?\" -> POST /users.json\n- \"Get u details?\" -> GET /u/{username}.json\n- \"Update a u?\" -> PUT /u/{username}.json\n- \"Get by-external details?\" -> GET /u/by-external/{external_id}.json\n- \"List all directory_items.json?\" -> GET /directory_items.json\n- \"Get user details?\" -> GET /admin/users/{id}.json\n- \"Delete a user?\" -> DELETE /admin/users/{id}.json\n- \"Create a log_out.json?\" -> POST /admin/users/{id}/log_out.json\n- \"Create a refresh_gravatar.json?\" -> POST /user_avatar/{username}/refresh_gravatar.json\n- \"List all users.json?\" -> GET /admin/users.json\n- \"Get list details?\" -> GET /admin/users/list/{flag}.json\n- \"List all user_actions.json?\" -> GET /user_actions.json\n- \"Create a forgot_password.json?\" -> POST /session/forgot_password.json\n- \"Update a password-reset?\" -> PUT /users/password-reset/{token}.json\n- \"List all emails.json?\" -> GET /u/{username}/emails.json\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Discourse API Documentation\n@base https://discourse.example.com\n@version latest\n@auth ApiKey token in query\n@endpoints 93\n@hint download_for_search\n@toc discourse-post-event(2), admin(20), categories.json(2), categories(1), c(2), groups(6), groups.json(1), invites.json(1), invites(1), notifications.json(1), notifications(1), posts.json(2), posts(5), post_actions.json(1), topics(2), search.json(1), site.json(1), site(1), tag_groups.json(2), tag_groups(2), tags.json(1), tag(1), t(12), latest.json(1), top.json(1), uploads.json(1), uploads(6), user-badges(1), users.json(1), u(8), directory_items.json(1), user_avatar(1), user_actions.json(1), session(1), users(1)\n\n@group discourse-post-event\n@endpoint GET /discourse-post-event/events.json\n@desc List calendar events\n@optional {include_details: str(true/false) # Include detailed event information (creator, invitees, stats, etc.), category_id: int # Filter events by category ID, include_subcategories: str(true/false) # Include events from subcategories when filtering by category, post_id: int # Filter to events associated with a specific post ID, attending_user: str # Filter to events where the specified user (username) has RSVP'd as going, before: str(date-time) # Return events starting before this date/time (ISO 8601 format), after: str(date-time) # Return events starting after this date/time (ISO 8601 format), order: str(asc/desc) # Sort order for events by start date (default: asc), limit: int # Maximum number of events to return (default: 200)}\n@returns(200) {events: [map]} # success response (detailed)\n\n@endpoint GET /discourse-post-event/events.ics\n@desc Export calendar events in iCalendar format\n@optional {category_id: int # Filter events by category ID, include_subcategories: str(true/false) # Include events from subcategories when filtering by category, attending_user: str # Filter to events where the specified user (username) has RSVP'd as going, before: str(date-time) # Return events starting before this date/time (ISO 8601 format), after: str(date-time) # Return events starting after this date/time (ISO 8601 format), order: str(asc/desc) # Sort order for events by start date (default: asc), limit: int # Maximum number of events to return (default: 200)}\n@returns(200) iCalendar file\n\n@endgroup\n\n@group admin\n@endpoint GET /admin/backups.json\n@desc List backups\n@returns(200) success response\n\n@endpoint POST /admin/backups.json\n@desc Create backup\n@required {with_uploads: bool}\n@returns(200) {success: str} # success response\n\n@endpoint PUT /admin/backups/{filename}\n@desc Send download backup email\n@required {filename: str}\n@returns(200) success response\n\n@endpoint GET /admin/backups/{filename}\n@desc Download backup\n@required {filename: str, token: str}\n@returns(200) success response\n\n@endpoint GET /admin/badges.json\n@desc List badges\n@returns(200) {badges: [map], badge_types: [map], badge_groupings: [map], admin_badges: map{protected_system_fields: [any], triggers: map{user_change: int, none: int, post_revision: int, trust_level_change: int, post_action: int}, badge_ids: [any], badge_grouping_ids: [any], badge_type_ids: [any]}} # success response\n\n@endpoint POST /admin/badges.json\n@desc Create badge\n@required {name: str # The name for the new badge., badge_type_id: int # The ID for the badge type. 1 for Gold, 2 for Silver, 3 for Bronze.}\n@returns(200) {badge_types: [map], badge: map{id: int, name: str, description: str, grant_count: int, allow_title: bool, multiple_grant: bool, icon: str, image_url: str?, image_upload_id: int?, listable: bool, enabled: bool, badge_grouping_id: int, system: bool, long_description: str, slug: str, manually_grantable: bool, query: str?, trigger: str?, target_posts: bool, auto_revoke: bool, show_posts: bool, badge_type_id: int, show_in_post_header: bool}} # success response\n\n@endpoint PUT /admin/badges/{id}.json\n@desc Update badge\n@required {id: int, name: str # The name for the new badge., badge_type_id: int # The ID for the badge type. 1 for Gold, 2 for Silver, 3 for Bronze.}\n@returns(200) {badge_types: [map], badge: map{id: int, name: str, description: str, grant_count: int, allow_title: bool, multiple_grant: bool, icon: str, image_url: str?, image_upload_id: int?, listable: bool, enabled: bool, badge_grouping_id: int, system: bool, long_description: str, slug: str, manually_grantable: bool, query: str?, trigger: str?, target_posts: bool, auto_revoke: bool, show_posts: bool, badge_type_id: int, show_in_post_header: bool}} # success response\n\n@endpoint DELETE /admin/badges/{id}.json\n@desc Delete badge\n@required {id: int}\n@returns(200) success response\n\n@endgroup\n\n@group categories.json\n@endpoint POST /categories.json\n@desc Creates a category\n@required {name: str}\n@optional {color: str, text_color: str, style_type: str, emoji: str, icon: str, parent_category_id: int, allow_badges: bool, slug: str, topic_featured_links_allowed: bool, permissions: map{everyone: int, staff: int}, search_priority: int, form_template_ids: [any], category_localizations: [map{id: int, locale!: str, name!: str, description: str}]}\n@returns(200) {category: map{id: int, name: str, color: str, text_color: str, style_type: str, emoji: str?, icon: str?, slug: str, locale: str?, topic_count: int, post_count: int, position: int, description: str?, description_text: str?, description_excerpt: str?, topic_url: str?, read_restricted: bool, permission: int?, notification_level: int, can_edit: bool, topic_template: str?, topic_title_placeholder: str?, form_template_ids: [any], has_children: bool?, subcategory_count: int?, sort_order: str?, sort_ascending: str?, show_subcategory_list: bool, num_featured_topics: int, default_view: str?, subcategory_list_style: str, default_top_period: str, default_list_filter: str, minimum_required_tags: int, navigate_to_first_post_after_read: bool, custom_fields: map, allowed_tags: [any], allowed_tag_groups: [any], allow_global_tags: bool, required_tag_groups: [map], category_setting: map{auto_bump_cooldown_days: int, num_auto_bump_daily: int?, require_reply_approval: bool?, require_topic_approval: bool?}, category_localizations: [any], read_only_banner: str?, available_groups: [any], auto_close_hours: str?, auto_close_based_on_last_post: bool, allow_unlimited_owner_edits_on_first_post: bool, default_slow_mode_seconds: str?, group_permissions: [map], email_in: str?, email_in_allow_strangers: bool, mailinglist_mirror: bool, all_topics_wiki: bool, can_delete: bool, allow_badges: bool, topic_featured_link_allowed: bool, search_priority: int, uploaded_logo: str?, uploaded_logo_dark: str?, uploaded_background: str?, uploaded_background_dark: str?, category_types: map}} # success response\n\n@endpoint GET /categories.json\n@desc Retrieves a list of categories\n@optional {include_subcategories: bool}\n@returns(200) {category_list: map{can_create_category: bool, can_create_topic: bool, categories: [map]}} # success response\n\n@endgroup\n\n@group categories\n@endpoint PUT /categories/{id}.json\n@desc Updates a category\n@required {id: int, name: str}\n@optional {color: str, text_color: str, style_type: str, emoji: str, icon: str, parent_category_id: int, allow_badges: bool, slug: str, topic_featured_links_allowed: bool, permissions: map{everyone: int, staff: int}, search_priority: int, form_template_ids: [any], category_localizations: [map{id: int, locale!: str, name!: str, description: str}]}\n@returns(200) {success: str, category: map{id: int, name: str, color: str, text_color: str, style_type: str, emoji: str?, icon: str?, slug: str, locale: str?, topic_count: int, post_count: int, position: int, description: str?, description_text: str?, description_excerpt: str?, topic_url: str?, read_restricted: bool, permission: int?, notification_level: int, can_edit: bool, topic_template: str?, topic_title_placeholder: str?, form_template_ids: [any], has_children: bool?, subcategory_count: int?, sort_order: str?, sort_ascending: str?, show_subcategory_list: bool, num_featured_topics: int, default_view: str?, subcategory_list_style: str, default_top_period: str, default_list_filter: str, minimum_required_tags: int, navigate_to_first_post_after_read: bool, custom_fields: map, allowed_tags: [any], allowed_tag_groups: [any], allow_global_tags: bool, required_tag_groups: [map], category_setting: map{auto_bump_cooldown_days: int, num_auto_bump_daily: int?, require_reply_approval: bool?, require_topic_approval: bool?}, category_localizations: [any], read_only_banner: str?, available_groups: [any], auto_close_hours: str?, auto_close_based_on_last_post: bool, allow_unlimited_owner_edits_on_first_post: bool, default_slow_mode_seconds: str?, group_permissions: [map], email_in: str?, email_in_allow_strangers: bool, mailinglist_mirror: bool, all_topics_wiki: bool, can_delete: bool, allow_badges: bool, topic_featured_link_allowed: bool, search_priority: int, uploaded_logo: str?, uploaded_logo_dark: str?, uploaded_background: str?, uploaded_background_dark: str?, category_types: map}} # success response\n\n@endgroup\n\n@group c\n@endpoint GET /c/{slug}/{id}.json\n@desc List topics\n@required {slug: str, id: int}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, per_page: int, top_tags: [map], topics: [map]}} # success response\n\n@endpoint GET /c/{id}/show.json\n@desc Show category\n@required {id: int}\n@returns(200) {category: map{id: int, name: str, color: str, text_color: str, style_type: str, emoji: str?, icon: str?, slug: str, locale: str?, topic_count: int, post_count: int, position: int, description: str?, description_text: str?, description_excerpt: str?, topic_url: str?, read_restricted: bool, permission: int?, notification_level: int, can_edit: bool, topic_template: str?, topic_title_placeholder: str?, form_template_ids: [any], has_children: bool?, subcategory_count: int?, sort_order: str?, sort_ascending: str?, show_subcategory_list: bool, num_featured_topics: int, default_view: str?, subcategory_list_style: str, default_top_period: str, default_list_filter: str, minimum_required_tags: int, navigate_to_first_post_after_read: bool, custom_fields: map, allowed_tags: [any], allowed_tag_groups: [any], allow_global_tags: bool, required_tag_groups: [map], category_setting: map{auto_bump_cooldown_days: int, num_auto_bump_daily: int?, require_reply_approval: bool?, require_topic_approval: bool?}, category_localizations: [any], read_only_banner: str?, available_groups: [any], auto_close_hours: str?, auto_close_based_on_last_post: bool, allow_unlimited_owner_edits_on_first_post: bool, default_slow_mode_seconds: str?, group_permissions: [map], email_in: str?, email_in_allow_strangers: bool, mailinglist_mirror: bool, all_topics_wiki: bool, can_delete: bool, allow_badges: bool, topic_featured_link_allowed: bool, search_priority: int, uploaded_logo: str?, uploaded_logo_dark: str?, uploaded_background: str?, uploaded_background_dark: str?, category_types: map}} # response\n\n@endgroup\n\n@group admin\n@endpoint POST /admin/groups.json\n@desc Create a group\n@required {group: map{name!: str, full_name: str, bio_raw: str, usernames: str, owner_usernames: str, automatic_membership_email_domains: str, visibility_level: int, primary_group: bool, flair_icon: str, flair_upload_id: int, flair_bg_color: str, public_admission: bool, public_exit: bool, default_notification_level: int, muted_category_ids: [int], regular_category_ids: [int], watching_category_ids: [int], tracking_category_ids: [int], watching_first_post_category_ids: [int]}}\n@returns(200) {basic_group: map{id: int, automatic: bool, name: str, user_count: int, mentionable_level: int, messageable_level: int, visibility_level: int, primary_group: bool, title: str?, grant_trust_level: str?, incoming_email: str?, has_messages: bool, flair_url: str?, flair_bg_color: str?, flair_color: str?, bio_raw: str?, bio_cooked: str?, bio_excerpt: str?, public_admission: bool, public_exit: bool, allow_membership_requests: bool, full_name: str?, default_notification_level: int, membership_request_template: str?, members_visibility_level: int, can_see_members: bool, can_admin_group: bool, can_edit_group: bool, publish_read_state: bool}} # group created\n\n@endpoint DELETE /admin/groups/{id}.json\n@desc Delete a group\n@required {id: int}\n@returns(200) {success: str} # response\n\n@endgroup\n\n@group groups\n@endpoint GET /groups/{name}.json\n@desc Get a group\n@required {name: str # Use group name instead of id}\n@returns(200) {group: map{id: int, automatic: bool, name: str, user_count: int, mentionable_level: int, messageable_level: int, visibility_level: int, primary_group: bool, title: str?, grant_trust_level: str?, incoming_email: str?, has_messages: bool, flair_url: str?, flair_bg_color: str?, flair_color: str?, bio_raw: str?, bio_cooked: str?, bio_excerpt: str?, public_admission: bool, public_exit: bool, allow_membership_requests: bool, full_name: str?, default_notification_level: int, membership_request_template: str?, is_group_user: bool, members_visibility_level: int, can_see_members: bool, can_admin_group: bool, can_edit_group: bool, publish_read_state: bool, is_group_owner_display: bool, mentionable: bool, messageable: bool, automatic_membership_email_domains: str?, smtp_updated_at: str?, smtp_updated_by: map?, smtp_enabled: bool, smtp_server: str?, smtp_port: str?, smtp_ssl_mode: int?, email_username: str?, email_from_alias: str?, email_password: str?, message_count: int, allow_unknown_sender_topic_replies: bool, associated_group_ids: [any], watching_category_ids: [any], tracking_category_ids: [any], watching_first_post_category_ids: [any], regular_category_ids: [any], muted_category_ids: [any], watching_tags: [any], watching_first_post_tags: [any], tracking_tags: [any], regular_tags: [any], muted_tags: [any]}, extras: map{visible_group_names: [any]}} # success response\n\n@endpoint PUT /groups/{id}.json\n@desc Update a group\n@required {id: int, group: map{name!: str, full_name: str, bio_raw: str, usernames: str, owner_usernames: str, automatic_membership_email_domains: str, visibility_level: int, primary_group: bool, flair_icon: str, flair_upload_id: int, flair_bg_color: str, public_admission: bool, public_exit: bool, default_notification_level: int, muted_category_ids: [int], regular_category_ids: [int], watching_category_ids: [int], tracking_category_ids: [int], watching_first_post_category_ids: [int]}}\n@returns(200) {success: str} # success response\n\n@endpoint GET /groups/by-id/{id}.json\n@desc Get a group by id\n@required {id: str # Use group name instead of id}\n@returns(200) {group: map{id: int, automatic: bool, name: str, user_count: int, mentionable_level: int, messageable_level: int, visibility_level: int, primary_group: bool, title: str?, grant_trust_level: str?, incoming_email: str?, has_messages: bool, flair_url: str?, flair_bg_color: str?, flair_color: str?, bio_raw: str?, bio_cooked: str?, bio_excerpt: str?, public_admission: bool, public_exit: bool, allow_membership_requests: bool, full_name: str?, default_notification_level: int, membership_request_template: str?, is_group_user: bool, members_visibility_level: int, can_see_members: bool, can_admin_group: bool, can_edit_group: bool, publish_read_state: bool, is_group_owner_display: bool, mentionable: bool, messageable: bool, automatic_membership_email_domains: str?, smtp_updated_at: str?, smtp_updated_by: map?, smtp_enabled: bool, smtp_server: str?, smtp_port: str?, smtp_ssl_mode: int?, email_username: str?, email_from_alias: str?, email_password: str?, message_count: int, allow_unknown_sender_topic_replies: bool, associated_group_ids: [any], watching_category_ids: [any], tracking_category_ids: [any], watching_first_post_category_ids: [any], regular_category_ids: [any], muted_category_ids: [any], watching_tags: [any], watching_first_post_tags: [any], tracking_tags: [any], regular_tags: [any], muted_tags: [any]}, extras: map{visible_group_names: [any]}} # success response (by id)\n\n@endpoint GET /groups/{name}/members.json\n@desc List group members\n@required {name: str # Use group name instead of id}\n@returns(200) {members: [map], owners: [map], meta: map{total: int, limit: int, offset: int}} # success response\n\n@endpoint PUT /groups/{id}/members.json\n@desc Add group members\n@required {id: int}\n@optional {usernames: str # comma separated list}\n@returns(200) {success: str, usernames: [any], emails: [any]} # success response\n\n@endpoint DELETE /groups/{id}/members.json\n@desc Remove group members\n@required {id: int}\n@optional {usernames: str # comma separated list}\n@returns(200) {success: str, usernames: [any], skipped_usernames: [any]} # success response\n\n@endgroup\n\n@group groups.json\n@endpoint GET /groups.json\n@desc List groups\n@returns(200) {groups: [map], extras: map{type_filters: [any]}, total_rows_groups: int, load_more_groups: str} # response\n\n@endgroup\n\n@group invites.json\n@endpoint POST /invites.json\n@desc Create an invite\n@required {Api-Key: str, Api-Username: str}\n@optional {email: str # required for email invites only, skip_email: bool=false, custom_message: str # optional, for email invites, max_redemptions_allowed: int=1 # optional, for link invites, topic_id: int, group_ids: str # Optional, either this or `group_names`. Comma separated list for multiple ids., group_names: str # Optional, either this or `group_ids`. Comma separated list for multiple names., expires_at: str # optional, if not supplied, the invite_expiry_days site setting is used}\n@returns(200) {id: int, invite_key: str, link: str, description: str?, email: str, domain: str?, emailed: bool, can_delete_invite: bool, custom_message: str?, created_at: str, updated_at: str, expires_at: str, expired: bool, topics: [map], groups: [map]} # success response\n\n@endgroup\n\n@group invites\n@endpoint POST /invites/create-multiple.json\n@desc Create multiple invites\n@required {Api-Key: str, Api-Username: str}\n@optional {email: str # pass 1 email per invite to be generated. other properties will be shared by each invite., skip_email: bool=false, custom_message: str # optional, for email invites, max_redemptions_allowed: int=1 # optional, for link invites, topic_id: int, group_ids: str # Optional, either this or `group_names`. Comma separated list for multiple ids., group_names: str # Optional, either this or `group_ids`. Comma separated list for multiple names., expires_at: str # optional, if not supplied, the invite_expiry_days site setting is used}\n@returns(200) {num_successfully_created_invitations: int, num_failed_invitations: int, failed_invitations: [any], successful_invitations: [any]} # success response\n\n@endgroup\n\n@group notifications.json\n@endpoint GET /notifications.json\n@desc Get the notifications that belong to the current user\n@returns(200) {notifications: [map], total_rows_notifications: int, seen_notification_id: int, load_more_notifications: str} # notifications\n\n@endgroup\n\n@group notifications\n@endpoint PUT /notifications/mark-read.json\n@desc Mark notifications as read\n@optional {id: int # (optional) Leave off to mark all notifications as read}\n@returns(200) {success: str} # notifications marked read\n\n@endgroup\n\n@group posts.json\n@endpoint GET /posts.json\n@desc List latest posts across topics\n@optional {before: int # Load posts with an id lower than this value. Useful for pagination.}\n@returns(200) {latest_posts: [map]} # latest posts\n\n@endpoint POST /posts.json\n@desc Creates a new topic, a new post, or a private message\n@required {raw: str}\n@optional {title: str # Required if creating a new topic or new private message., topic_id: int # Required if creating a new post., category: int # Optional if creating a new topic, and ignored if creating a new post., target_recipients: str # Required for private message, comma separated., target_usernames: str # Deprecated. Use target_recipients instead., archetype: str # Required for new private message., created_at: str, reply_to_post_number: int # Optional, the post number to reply to inside a topic., embed_url: str # Provide a URL from a remote system to associate a forum topic with that URL, typically for using Discourse as a comments system for an external blog., external_id: str # Provide an external_id from a remote system to associate a forum topic with that id., auto_track: bool # If false, the user will not track the topic. By default, the user will track the topic.}\n@returns(200) {id: int, name: str?, username: str, avatar_template: str, created_at: str, raw: str, cooked: str, post_number: int, post_type: int, posts_count: int, updated_at: str, reply_count: int, reply_to_post_number: str?, quote_count: int, incoming_link_count: int, reads: int, readers_count: int, score: num, yours: bool, topic_id: int, topic_slug: str, display_username: str?, primary_group_name: str?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, flair_group_id: int?, badges_granted: [any], version: int, can_edit: bool, can_delete: bool, can_recover: bool, can_see_hidden_post: bool, can_wiki: bool, user_title: str?, bookmarked: bool, actions_summary: [map], moderator: bool, admin: bool, staff: bool, user_id: int, draft_sequence: int, hidden: bool, trust_level: int, deleted_at: str?, user_deleted: bool, edit_reason: str?, can_view_edit_history: bool, wiki: bool, reviewable_id: int?, reviewable_score_count: int, reviewable_score_pending_count: int, post_url: str, post_localizations: [any], mentioned_users: [any]} # post created\n\n@endgroup\n\n@group posts\n@endpoint GET /posts/{id}.json\n@desc Retrieve a single post\n@required {id: str}\n@returns(200) {id: int, username: str, avatar_template: str, created_at: str, cooked: str, post_number: int, post_type: int, posts_count: int, updated_at: str, reply_count: int, reply_to_post_number: str?, quote_count: int, incoming_link_count: int, reads: int, readers_count: int, score: num, yours: bool, topic_id: int, topic_slug: str, primary_group_name: str?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, flair_group_id: int?, version: int, can_edit: bool, can_delete: bool, can_recover: bool, can_see_hidden_post: bool, can_wiki: bool, user_title: str?, bookmarked: bool, raw: str, actions_summary: [map], moderator: bool, admin: bool, staff: bool, user_id: int, hidden: bool, trust_level: int, deleted_at: str?, user_deleted: bool, edit_reason: str?, can_view_edit_history: bool, wiki: bool, reviewable_id: int?, reviewable_score_count: int, reviewable_score_pending_count: int, post_url: str, mentioned_users: [any], name: str?, display_username: str?} # single reviewable post\n\n@endpoint PUT /posts/{id}.json\n@desc Update a single post\n@required {id: str}\n@optional {post: map{raw!: str, edit_reason: str}, bypass_bump: bool # Skip bumping the topic when updating the post. Requires staff or TL4 permissions.}\n@returns(200) {post: map{id: int, username: str, avatar_template: str, created_at: str, cooked: str, post_number: int, post_type: int, posts_count: int, updated_at: str, reply_count: int, reply_to_post_number: str?, quote_count: int, incoming_link_count: int, reads: int, readers_count: int, score: num, yours: bool, topic_id: int, topic_slug: str, primary_group_name: str?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, flair_group_id: int?, badges_granted: [any], version: int, can_edit: bool, can_delete: bool, can_recover: bool, can_see_hidden_post: bool, can_wiki: bool, user_title: str?, bookmarked: bool, raw: str, actions_summary: [map], moderator: bool, admin: bool, staff: bool, user_id: int, draft_sequence: int, hidden: bool, trust_level: int, deleted_at: str?, user_deleted: bool, edit_reason: str?, can_view_edit_history: bool, wiki: bool, reviewable_id: int?, reviewable_score_count: int, reviewable_score_pending_count: int, post_url: str, post_localizations: [any], mentioned_users: [any], name: str?, display_username: str?}} # post updated\n\n@endpoint DELETE /posts/{id}.json\n@desc delete a single post\n@required {id: int}\n@optional {force_destroy: bool # The `SiteSetting.can_permanently_delete` needs to be enabled first before this param can be used. Also this endpoint needs to be called first without `force_destroy` and then followed up with a second call 5 minutes later with `force_destroy` to permanently delete.}\n@returns(200) success response\n\n@endpoint GET /posts/{id}/replies.json\n@desc List replies to a post\n@required {id: str}\n@returns(200) post replies\n\n@endpoint PUT /posts/{id}/locked.json\n@desc Lock a post from being edited\n@required {Api-Key: str, Api-Username: str, id: str, locked: str # Whether to lock the post (true/false)}\n@returns(200) {locked: bool} # post updated\n\n@endgroup\n\n@group post_actions.json\n@endpoint POST /post_actions.json\n@desc Like a post and other actions\n@required {Api-Key: str, Api-Username: str, id: int # The ID of the post to perform the action on, post_action_type_id: int # The ID of the post action type (e.g., 2 for like)}\n@optional {flag_topic: bool # Whether to flag the entire topic}\n@returns(200) {id: int, name: str, username: str, avatar_template: str, created_at: str, cooked: str, post_number: int, post_type: int, posts_count: int, updated_at: str, reply_count: int, reply_to_post_number: str?, quote_count: int, incoming_link_count: int, reads: int, readers_count: int, score: num, yours: bool, topic_id: int, topic_slug: str, display_username: str, primary_group_name: str?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, flair_group_id: int?, badges_granted: [any], version: int, can_edit: bool, can_delete: bool, can_recover: bool, can_see_hidden_post: bool, can_wiki: bool, user_title: str?, bookmarked: bool, actions_summary: [map], moderator: bool, admin: bool, staff: bool, user_id: int, hidden: bool, trust_level: int, deleted_at: str?, user_deleted: bool, edit_reason: str?, can_view_edit_history: bool, wiki: bool, reviewable_id: int?, reviewable_score_count: int, reviewable_score_pending_count: int, post_url: str} # post updated\n\n@endgroup\n\n@group topics\n@endpoint GET /topics/private-messages/{username}.json\n@desc Get a list of private messages for a user\n@required {username: str}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, draft: str?, draft_key: str, draft_sequence: int, per_page: int, topics: [map]}} # private messages\n\n@endpoint GET /topics/private-messages-sent/{username}.json\n@desc Get a list of private messages sent for a user\n@required {username: str}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, draft: str?, draft_key: str, draft_sequence: int, per_page: int, topics: [map]}} # private messages\n\n@endgroup\n\n@group search.json\n@endpoint GET /search.json\n@desc Search for a term\n@optional {q: str # The query string needs to be url encoded and is made up of the following options: - Search term. This is just a string. Usually it would be the first item in the query. - `@`: Use the `@` followed by the username to specify posts by this user. - `#`: Use the `#` followed by the category slug to search within this category. - `tags:`: `api,solved` or for posts that have all the specified tags `api+solved`. - `before:`: `yyyy-mm-dd` - `after:`: `yyyy-mm-dd` - `order:`: `latest`, `likes`, `views`, `latest_topic` - `assigned:`: username (without `@`) - `in:`: `title`, `likes`, `personal`, `messages`, `seen`, `unseen`, `posted`, `created`, `watching`, `tracking`, `bookmarks`, `assigned`, `unassigned`, `first`, `pinned`, `wiki` - `with:`: `images` - `status:`: `open`, `closed`, `public`, `archived`, `noreplies`, `single_user`, `solved`, `unsolved` - `group:`: group_name or group_id - `group_messages:`: group_name or group_id - `min_posts:`: 1 - `max_posts:`: 10 - `min_views:`: 1 - `max_views:`: 10  If you are using cURL you can use the `-G` and the `--data-urlencode` flags to encode the query:  ``` curl -i -sS -X GET -G \"http://localhost:4200/search.json\" \\ --data-urlencode 'q=wordpress @scossar #fun after:2020-01-01' ```, page: int}\n@returns(200) {posts: [any], users: [any], categories: [any], tags: [map], groups: [any], grouped_search_result: map{more_posts: str?, more_users: str?, more_categories: str?, term: str, search_log_id: int, more_full_page_results: str?, can_create_topic: bool, error: str?, extra: map{categories: [any]?}, post_ids: [any], user_ids: [any], category_ids: [any], tag_ids: [any], group_ids: [any]}} # success response\n\n@endgroup\n\n@group site.json\n@endpoint GET /site.json\n@desc Get site info\n@returns(200) {default_archetype: str, notification_types: map{mentioned: int, replied: int, quoted: int, edited: int, liked: int, private_message: int, invited_to_private_message: int, invitee_accepted: int, posted: int, watching_category_or_tag: int, new_features: int, admin_problems: int, moved_post: int, linked: int, granted_badge: int, invited_to_topic: int, custom: int, group_mentioned: int, group_message_summary: int, watching_first_post: int, topic_reminder: int, liked_consolidated: int, linked_consolidated: int, post_approved: int, code_review_commit_approved: int, membership_request_accepted: int, membership_request_consolidated: int, bookmark_reminder: int, reaction: int, votes_released: int, event_reminder: int, event_invitation: int, chat_mention: int, chat_message: int, chat_invitation: int, chat_group_mention: int, chat_quoted: int, chat_watched_thread: int, upcoming_change_available: int, upcoming_change_automatically_promoted: int, assigned: int, question_answer_user_commented: int, following: int, following_created_topic: int, following_replied: int, circles_activity: int}, post_types: map{regular: int, moderator_action: int, small_action: int, whisper: int}, trust_levels: map{newuser: int, basic: int, member: int, regular: int, leader: int}, user_tips: map{first_notification: int, topic_timeline: int, post_menu: int, topic_notification_levels: int, suggested_topics: int}, groups: [map], filters: [any], periods: [any], top_menu_items: [any], anonymous_top_menu_items: [any], uncategorized_category_id: int, user_field_max_length: int, post_action_types: [map], topic_flag_types: [map], can_create_tag: bool, can_tag_topics: bool, can_tag_pms: bool, tags_filter_regexp: str, top_tags: [map], wizard_required: bool, can_associate_groups: bool, email_configured: bool, topic_featured_link_allowed_category_ids: [any], user_themes: [map], user_color_schemes: [map], default_light_color_scheme: map?, default_dark_color_scheme: map?, censored_regexp: [map], custom_emoji_translation: map, watched_words_replace: str?, watched_words_link: str?, markdown_additional_options: map, hashtag_configurations: map, hashtag_icons: map, displayed_about_plugin_stat_groups: [any], categories: [map], archetypes: [map], user_fields: [any], auth_providers: [any], whispers_allowed_groups_names: [any], denied_emojis: [any], valid_flag_applies_to_types: [any], navigation_menu_site_top_tags: [any], full_name_required_for_signup: bool, full_name_visible_in_signup: bool, admin_config_login_routes: [any]} # success response\n\n@endgroup\n\n@group site\n@endpoint GET /site/basic-info.json\n@desc Get site basic info\n@returns(200) {logo_url: str, logo_small_url: str, apple_touch_icon_url: str, favicon_url: str, title: str, description: str, header_primary_color: str, header_background_color: str, login_required: bool, locale: str, include_in_discourse_discover: bool, mobile_logo_url: str} # success response\n\n@endgroup\n\n@group tag_groups.json\n@endpoint GET /tag_groups.json\n@desc Get a list of tag groups\n@returns(200) {tag_groups: [map]} # tags\n\n@endpoint POST /tag_groups.json\n@desc Creates a tag group\n@required {name: str}\n@returns(200) {tag_group: map{id: int, name: str, tags: [map], parent_tag: [map], one_per_topic: bool, permissions: map}} # tag group created\n\n@endgroup\n\n@group tag_groups\n@endpoint GET /tag_groups/{id}.json\n@desc Get a single tag group\n@required {id: str}\n@returns(200) {tag_group: map{id: int, name: str, tag_names: [any], parent_tag_name: [any], one_per_topic: bool, permissions: map{everyone: int}}} # notifications\n\n@endpoint PUT /tag_groups/{id}.json\n@desc Update tag group\n@required {id: str}\n@optional {name: str}\n@returns(200) {success: str, tag_group: map{id: int, name: str, tag_names: [any], parent_tag_name: [any], one_per_topic: bool, permissions: map{everyone: int}}} # Tag group updated\n\n@endgroup\n\n@group tags.json\n@endpoint GET /tags.json\n@desc Get a list of tags\n@returns(200) {tags: [map], extras: map{categories: [any]}} # notifications\n\n@endgroup\n\n@group tag\n@endpoint GET /tag/{name}.json\n@desc Get a specific tag\n@required {name: str}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, draft: str?, draft_key: str, draft_sequence: int, per_page: int, tags: [map], topics: [map]}} # notifications\n\n@endgroup\n\n@group t\n@endpoint GET /t/{id}/posts.json\n@desc Get specific posts from a topic\n@required {Api-Key: str, Api-Username: str, id: str, post_ids[]: int}\n@returns(200) {post_stream: map{posts: [map]}, id: int} # specific posts\n\n@endpoint GET /t/{id}.json\n@desc Get a single topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@returns(200) {post_stream: map{posts: [map], stream: [any]}, timeline_lookup: [any], suggested_topics: [map], tags: [map], tags_descriptions: map, id: int, title: str, fancy_title: str, posts_count: int, created_at: str, views: int, reply_count: int, like_count: int, last_posted_at: str?, visible: bool, closed: bool, archived: bool, has_summary: bool, archetype: str, slug: str, category_id: int, word_count: int?, deleted_at: str?, user_id: int, featured_link: str?, pinned_globally: bool, pinned_at: str?, pinned_until: str?, image_url: str?, slow_mode_seconds: int, draft: str?, draft_key: str, draft_sequence: int, unpinned: str?, pinned: bool, current_post_number: int, highest_post_number: int?, deleted_by: str?, has_deleted: bool, actions_summary: [map], chunk_size: int, bookmarked: bool, bookmarks: [any], topic_timer: str?, message_bus_last_id: int, participant_count: int, show_read_indicator: bool, thumbnails: str?, slow_mode_enabled_until: str?, details: map{can_edit: bool, notification_level: int, can_move_posts: bool, can_delete: bool, can_remove_allowed_users: bool, can_create_post: bool, can_reply_as_new_topic: bool, can_invite_to: bool, can_invite_via_email: bool, can_flag_topic: bool, can_convert_topic: bool, can_review_topic: bool, can_close_topic: bool, can_archive_topic: bool, can_split_merge_topic: bool, can_edit_staff_notes: bool, can_toggle_topic_visibility: bool, can_pin_unpin_topic: bool, can_banner_topic: bool, can_moderate_category: bool, can_remove_self_id: int, participants: [map], created_by: map{id: int, username: str, name: str, avatar_template: str}, last_poster: map{id: int, username: str, name: str, avatar_template: str}}} # specific posts\n\n@endpoint DELETE /t/{id}.json\n@desc Remove a topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@returns(200) specific posts\n\n@endpoint PUT /t/-/{id}.json\n@desc Update a topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@optional {topic: map{title: str, category_id: int}}\n@returns(200) {basic_topic: map{id: int, title: str, fancy_title: str, slug: str, posts_count: int}} # topic updated\n\n@endpoint POST /t/{id}/invite.json\n@desc Invite to topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@optional {user: str, email: str}\n@returns(200) {user: map{id: int, username: str, name: str, avatar_template: str}} # topic updated\n\n@endpoint POST /t/{id}/invite-group.json\n@desc Invite group to topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@optional {group: str # The name of the group to invite, should_notify: bool # Whether to notify the group, it defaults to true}\n@returns(200) {group: map{id: int, name: str}} # invites to a PM\n\n@endpoint PUT /t/{id}/bookmark.json\n@desc Bookmark topic\n@required {Api-Key: str, Api-Username: str, id: str}\n@returns(200) topic updated\n\n@endpoint PUT /t/{id}/status.json\n@desc Update the status of a topic\n@required {Api-Key: str, Api-Username: str, id: str, status: str(closed/pinned/pinned_globally/archived/visible), enabled: str(true/false)}\n@optional {until: str # Only required for `pinned` and `pinned_globally`}\n@returns(200) {success: str, topic_status_update: str?} # topic updated\n\n@endgroup\n\n@group latest.json\n@endpoint GET /latest.json\n@desc Get the latest topics\n@required {Api-Key: str, Api-Username: str}\n@optional {order: str # Enum: `default`, `created`, `activity`, `views`, `posts`, `category`, `likes`, `op_likes`, `posters`, ascending: str # Defaults to `desc`, add `ascending=true` to sort asc, per_page: int # Maximum number of topics returned, between 1-100}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, draft: str?, draft_key: str, draft_sequence: int, per_page: int, topics: [map]}} # topic updated\n\n@endgroup\n\n@group top.json\n@endpoint GET /top.json\n@desc Get the top topics filtered by period\n@required {Api-Key: str, Api-Username: str}\n@optional {period: str # Enum: `all`, `yearly`, `quarterly`, `monthly`, `weekly`, `daily`, per_page: int # Maximum number of topics returned, between 1-100}\n@returns(200) {users: [map], primary_groups: [any], topic_list: map{can_create_topic: bool, draft: str?, draft_key: str, draft_sequence: int, for_period: str, per_page: int, topics: [map]}} # response\n\n@endgroup\n\n@group t\n@endpoint POST /t/{id}/notifications.json\n@desc Set notification level\n@required {Api-Key: str, Api-Username: str, id: str, notification_level: str(0/1/2/3)}\n@returns(200) {success: str} # topic updated\n\n@endpoint PUT /t/{id}/change-timestamp.json\n@desc Update topic timestamp\n@required {Api-Key: str, Api-Username: str, id: str, timestamp: str}\n@returns(200) {success: str} # topic updated\n\n@endpoint POST /t/{id}/timer.json\n@desc Create topic timer\n@required {Api-Key: str, Api-Username: str, id: str}\n@optional {time: str, status_type: str, based_on_last_post: bool, category_id: int}\n@returns(200) {success: str, execute_at: str, duration: str?, based_on_last_post: bool, closed: bool, category_id: int?} # topic updated\n\n@endpoint GET /t/external_id/{external_id}.json\n@desc Get topic by external_id\n@required {external_id: str}\n@errors {301: redirects to /t/{topic_id}.json}\n\n@endgroup\n\n@group uploads.json\n@endpoint POST /uploads.json\n@desc Creates an upload\n@returns(200) {id: int, url: str, original_filename: str, filesize: int, width: int, height: int, thumbnail_width: int, thumbnail_height: int, extension: str, short_url: str, short_path: str, retain_hours: str?, human_filesize: str, dominant_color: str?, thumbnail: map?, optimized_video: map?} # file uploaded\n\n@endgroup\n\n@group uploads\n@endpoint POST /uploads/generate-presigned-put.json\n@desc Initiates a direct external upload\n@required {type: str(avatar/profile_background/card_background/custom_emoji/composer), file_name: str, file_size: int # File size should be represented in bytes.}\n@optional {metadata: map{sha1-checksum: str}}\n@returns(200) {key: str, url: str, signed_headers: map, unique_identifier: str} # external upload initialized\n\n@endpoint POST /uploads/complete-external-upload.json\n@desc Completes a direct external upload\n@required {unique_identifier: str # The unique identifier returned in the original /generate-presigned-put request.}\n@optional {for_private_message: str # Optionally set this to true if the upload is for a private message., for_site_setting: str # Optionally set this to true if the upload is for a site setting., pasted: str # Optionally set this to true if the upload was pasted into the upload area. This will convert PNG files to JPEG.}\n@returns(200) {id: int, url: str, original_filename: str, filesize: int, width: int, height: int, thumbnail_width: int, thumbnail_height: int, extension: str, short_url: str, short_path: str, retain_hours: str?, human_filesize: str, dominant_color: str?, thumbnail: map?, optimized_video: map?} # external upload initialized\n\n@endpoint POST /uploads/create-multipart.json\n@desc Creates a multipart external upload\n@required {upload_type: str(avatar/profile_background/card_background/custom_emoji/composer), file_name: str, file_size: int # File size should be represented in bytes.}\n@optional {metadata: map{sha1-checksum: str}}\n@returns(200) {key: str, external_upload_identifier: str, unique_identifier: str} # external upload initialized\n\n@endpoint POST /uploads/batch-presign-multipart-parts.json\n@desc Generates batches of presigned URLs for multipart parts\n@required {part_numbers: [any] # The part numbers to generate the presigned URLs for, must be between 1 and 10000., unique_identifier: str # The unique identifier returned in the original /create-multipart request.}\n@returns(200) {presigned_urls: map} # external upload initialized\n\n@endpoint POST /uploads/abort-multipart.json\n@desc Abort multipart upload\n@required {external_upload_identifier: str # The identifier of the multipart upload in the external storage provider. This is the multipart upload_id in AWS S3.}\n@returns(200) {success: str} # external upload initialized\n\n@endpoint POST /uploads/complete-multipart.json\n@desc Complete multipart upload\n@required {unique_identifier: str # The unique identifier returned in the original /create-multipart request., parts: [any] # All of the part numbers and their corresponding ETags that have been uploaded must be provided.}\n@returns(200) {id: int, url: str, original_filename: str, filesize: int, width: int, height: int, thumbnail_width: int, thumbnail_height: int, extension: str, short_url: str, short_path: str, retain_hours: str?, human_filesize: str, dominant_color: str?, thumbnail: map?, optimized_video: map?} # external upload initialized\n\n@endgroup\n\n@group user-badges\n@endpoint GET /user-badges/{username}.json\n@desc List badges for a user\n@required {username: str}\n@returns(200) {badges: [map], badge_types: [map], granted_bies: [map], user_badges: [map]} # success response\n\n@endgroup\n\n@group users.json\n@endpoint POST /users.json\n@desc Creates a user\n@required {Api-Key: str, Api-Username: str, name: str, email: str, password: str, username: str}\n@optional {active: bool # This param requires an admin api key in the request header or it will be ignored, approved: bool, user_fields: map{1: bool}, external_ids: map}\n@returns(200) {success: bool, active: bool, message: str, user_id: int} # user created\n\n@endgroup\n\n@group u\n@endpoint GET /u/{username}.json\n@desc Get a single user by username\n@required {Api-Key: str, Api-Username: str, username: str}\n@returns(200) {user_badges: [any], user: map{id: int, username: str, name: str, avatar_template: str, last_posted_at: str?, last_seen_at: str?, created_at: str, ignored: bool, muted: bool, can_ignore_user: bool, can_ignore_users: bool, can_mute_user: bool, can_mute_users: bool, can_send_private_messages: bool, can_send_private_message_to_user: bool, trust_level: int, moderator: bool, admin: bool, title: str?, badge_count: int, second_factor_backup_enabled: bool, user_fields: map{1: str?, 2: str?}, custom_fields: map{first_name: str?}, time_read: int, recent_time_read: int, primary_group_id: int?, primary_group_name: str?, flair_group_id: int?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, featured_topic: str?, staged: bool, can_edit: bool, can_edit_username: bool, can_edit_email: bool, can_edit_name: bool, uploaded_avatar_id: int?, has_title_badges: bool, pending_count: int, pending_posts_count: int, profile_view_count: int, second_factor_enabled: bool, can_upload_profile_header: bool, can_upload_user_card_background: bool, post_count: int, topic_count: int, can_be_deleted: bool, can_delete_all_posts: bool, locale: str?, muted_category_ids: [any], regular_category_ids: [any], watched_tags: [any], watching_first_post_tags: [any], tracked_tags: [any], muted_tags: [any], tracked_category_ids: [any], watched_category_ids: [any], watched_first_post_category_ids: [any], system_avatar_upload_id: str?, system_avatar_template: str, muted_usernames: [any], ignored_usernames: [any], allowed_pm_usernames: [any], mailing_list_posts_per_day: int, can_change_bio: bool, can_change_location: bool, can_change_website: bool, can_change_tracking_preferences: bool, user_api_keys: str?, user_passkeys: [any], sidebar_tags: [any], sidebar_category_ids: [any], display_sidebar_tags: bool, can_pick_theme_with_custom_homepage: bool, user_auth_tokens: [map], user_notification_schedule: map{enabled: bool, day_0_start_time: int, day_0_end_time: int, day_1_start_time: int, day_1_end_time: int, day_2_start_time: int, day_2_end_time: int, day_3_start_time: int, day_3_end_time: int, day_4_start_time: int, day_4_end_time: int, day_5_start_time: int, day_5_end_time: int, day_6_start_time: int, day_6_end_time: int}, use_logo_small_as_avatar: bool, featured_user_badge_ids: [any], invited_by: str?, groups: [map], group_users: [map], user_option: map{user_id: int, mailing_list_mode: bool, mailing_list_mode_frequency: int, email_digests: bool, email_level: int, email_messages_level: int, external_links_in_new_tab: bool, bookmark_auto_delete_preference: int, color_scheme_id: str?, dark_scheme_id: str?, dynamic_favicon: bool, enable_quoting: bool, enable_smart_lists: bool, enable_markdown_monospace_font: bool, enable_defer: bool, digest_after_minutes: int, automatically_unpin_topics: bool, auto_track_topics_after_msecs: int, notification_level_when_replying: int, new_topic_duration_minutes: int, email_previous_replies: int, email_in_reply_to: bool, like_notification_frequency: int, notify_on_linked_posts: bool, include_tl0_in_digests: bool, theme_ids: [any], theme_key_seq: int, allow_private_messages: bool, enable_allowed_pm_users: bool, homepage_id: str?, hide_profile_and_presence: bool, hide_profile: bool, hide_presence: bool, text_size: str, text_size_seq: int, title_count_mode: str, timezone: str?, skip_new_user_tips: bool, default_calendar: str, oldest_search_log_date: str?, sidebar_link_to_filtered_list: bool, sidebar_show_count_of_new_items: bool, watched_precedence_over_muted: bool, seen_popups: [any]?, topics_unread_when_closed: bool, composition_mode: int, interface_color_mode: int}}} # user with primary group response\n\n@endpoint PUT /u/{username}.json\n@desc Update a user\n@required {Api-Key: str, Api-Username: str, username: str}\n@optional {name: str, external_ids: map}\n@returns(200) {success: str, user: map} # user updated\n\n@endpoint GET /u/by-external/{external_id}.json\n@desc Get a user by external_id\n@required {Api-Key: str, Api-Username: str, external_id: str}\n@returns(200) {user_badges: [any], user: map{id: int, username: str, name: str, avatar_template: str, last_posted_at: str?, last_seen_at: str?, created_at: str, ignored: bool, muted: bool, can_ignore_user: bool, can_ignore_users: bool, can_mute_user: bool, can_mute_users: bool, can_send_private_messages: bool, can_send_private_message_to_user: bool, trust_level: int, moderator: bool, admin: bool, title: str?, badge_count: int, second_factor_backup_enabled: bool, user_fields: map{1: str?, 2: str?}, custom_fields: map{first_name: str?}, time_read: int, recent_time_read: int, primary_group_id: int?, primary_group_name: str?, flair_group_id: int?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, featured_topic: str?, staged: bool, can_edit: bool, can_edit_username: bool, can_edit_email: bool, can_edit_name: bool, uploaded_avatar_id: int?, has_title_badges: bool, pending_count: int, pending_posts_count: int, profile_view_count: int, second_factor_enabled: bool, can_upload_profile_header: bool, can_upload_user_card_background: bool, post_count: int, topic_count: int, can_be_deleted: bool, can_delete_all_posts: bool, locale: str?, muted_category_ids: [any], regular_category_ids: [any], watched_tags: [any], watching_first_post_tags: [any], tracked_tags: [any], muted_tags: [any], tracked_category_ids: [any], watched_category_ids: [any], watched_first_post_category_ids: [any], system_avatar_upload_id: str?, system_avatar_template: str, muted_usernames: [any], ignored_usernames: [any], allowed_pm_usernames: [any], mailing_list_posts_per_day: int, can_change_bio: bool, can_change_location: bool, can_change_website: bool, can_change_tracking_preferences: bool, user_api_keys: str?, user_passkeys: [any], sidebar_tags: [any], sidebar_category_ids: [any], display_sidebar_tags: bool, can_pick_theme_with_custom_homepage: bool, user_auth_tokens: [map], user_notification_schedule: map{enabled: bool, day_0_start_time: int, day_0_end_time: int, day_1_start_time: int, day_1_end_time: int, day_2_start_time: int, day_2_end_time: int, day_3_start_time: int, day_3_end_time: int, day_4_start_time: int, day_4_end_time: int, day_5_start_time: int, day_5_end_time: int, day_6_start_time: int, day_6_end_time: int}, use_logo_small_as_avatar: bool, featured_user_badge_ids: [any], invited_by: str?, groups: [map], group_users: [map], user_option: map{user_id: int, mailing_list_mode: bool, mailing_list_mode_frequency: int, email_digests: bool, email_level: int, email_messages_level: int, external_links_in_new_tab: bool, bookmark_auto_delete_preference: int, color_scheme_id: str?, dark_scheme_id: str?, dynamic_favicon: bool, enable_quoting: bool, enable_smart_lists: bool, enable_markdown_monospace_font: bool, enable_defer: bool, digest_after_minutes: int, automatically_unpin_topics: bool, auto_track_topics_after_msecs: int, notification_level_when_replying: int, new_topic_duration_minutes: int, email_previous_replies: int, email_in_reply_to: bool, like_notification_frequency: int, notify_on_linked_posts: bool, include_tl0_in_digests: bool, theme_ids: [any], theme_key_seq: int, allow_private_messages: bool, enable_allowed_pm_users: bool, homepage_id: str?, hide_profile_and_presence: bool, hide_profile: bool, hide_presence: bool, text_size: str, text_size_seq: int, title_count_mode: str, timezone: str?, skip_new_user_tips: bool, default_calendar: str, oldest_search_log_date: str?, sidebar_link_to_filtered_list: bool, sidebar_show_count_of_new_items: bool, watched_precedence_over_muted: bool, seen_popups: [any]?, topics_unread_when_closed: bool, composition_mode: int, interface_color_mode: int}}} # user response\n\n@endpoint GET /u/by-external/{provider}/{external_id}.json\n@desc Get a user by identity provider external ID\n@required {Api-Key: str, Api-Username: str, provider: str # Authentication provider name. Can be found in the provider callback URL: `/auth/{provider}/callback`, external_id: str}\n@returns(200) {user_badges: [any], user: map{id: int, username: str, name: str, avatar_template: str, last_posted_at: str?, last_seen_at: str?, created_at: str, ignored: bool, muted: bool, can_ignore_user: bool, can_ignore_users: bool, can_mute_user: bool, can_mute_users: bool, can_send_private_messages: bool, can_send_private_message_to_user: bool, trust_level: int, moderator: bool, admin: bool, title: str?, badge_count: int, second_factor_backup_enabled: bool, user_fields: map{1: str?, 2: str?}, custom_fields: map{first_name: str?}, time_read: int, recent_time_read: int, primary_group_id: int?, primary_group_name: str?, flair_group_id: int?, flair_name: str?, flair_url: str?, flair_bg_color: str?, flair_color: str?, featured_topic: str?, staged: bool, can_edit: bool, can_edit_username: bool, can_edit_email: bool, can_edit_name: bool, uploaded_avatar_id: int?, has_title_badges: bool, pending_count: int, pending_posts_count: int, profile_view_count: int, second_factor_enabled: bool, can_upload_profile_header: bool, can_upload_user_card_background: bool, post_count: int, topic_count: int, can_be_deleted: bool, can_delete_all_posts: bool, locale: str?, muted_category_ids: [any], regular_category_ids: [any], watched_tags: [any], watching_first_post_tags: [any], tracked_tags: [any], muted_tags: [any], tracked_category_ids: [any], watched_category_ids: [any], watched_first_post_category_ids: [any], system_avatar_upload_id: str?, system_avatar_template: str, muted_usernames: [any], ignored_usernames: [any], allowed_pm_usernames: [any], mailing_list_posts_per_day: int, can_change_bio: bool, can_change_location: bool, can_change_website: bool, can_change_tracking_preferences: bool, user_api_keys: str?, user_passkeys: [any], sidebar_tags: [any], sidebar_category_ids: [any], display_sidebar_tags: bool, can_pick_theme_with_custom_homepage: bool, user_auth_tokens: [map], user_notification_schedule: map{enabled: bool, day_0_start_time: int, day_0_end_time: int, day_1_start_time: int, day_1_end_time: int, day_2_start_time: int, day_2_end_time: int, day_3_start_time: int, day_3_end_time: int, day_4_start_time: int, day_4_end_time: int, day_5_start_time: int, day_5_end_time: int, day_6_start_time: int, day_6_end_time: int}, use_logo_small_as_avatar: bool, featured_user_badge_ids: [any], invited_by: str?, groups: [map], group_users: [map], user_option: map{user_id: int, mailing_list_mode: bool, mailing_list_mode_frequency: int, email_digests: bool, email_level: int, email_messages_level: int, external_links_in_new_tab: bool, bookmark_auto_delete_preference: int, color_scheme_id: str?, dark_scheme_id: str?, dynamic_favicon: bool, enable_quoting: bool, enable_smart_lists: bool, enable_markdown_monospace_font: bool, enable_defer: bool, digest_after_minutes: int, automatically_unpin_topics: bool, auto_track_topics_after_msecs: int, notification_level_when_replying: int, new_topic_duration_minutes: int, email_previous_replies: int, email_in_reply_to: bool, like_notification_frequency: int, notify_on_linked_posts: bool, include_tl0_in_digests: bool, theme_ids: [any], theme_key_seq: int, allow_private_messages: bool, enable_allowed_pm_users: bool, homepage_id: str?, hide_profile_and_presence: bool, hide_profile: bool, hide_presence: bool, text_size: str, text_size_seq: int, title_count_mode: str, timezone: str?, skip_new_user_tips: bool, default_calendar: str, oldest_search_log_date: str?, sidebar_link_to_filtered_list: bool, sidebar_show_count_of_new_items: bool, watched_precedence_over_muted: bool, seen_popups: [any]?, topics_unread_when_closed: bool, composition_mode: int, interface_color_mode: int}}} # user response\n\n@endpoint PUT /u/{username}/preferences/avatar/pick.json\n@desc Update avatar\n@required {username: str, upload_id: int, type: str(uploaded/custom/gravatar/system)}\n@returns(200) {success: str} # avatar updated\n\n@endpoint PUT /u/{username}/preferences/email.json\n@desc Update email\n@required {username: str, email: str(email)}\n@returns(200) email updated\n\n@endpoint PUT /u/{username}/preferences/username.json\n@desc Update username\n@required {username: str, new_username: str}\n@returns(200) username updated\n\n@endgroup\n\n@group directory_items.json\n@endpoint GET /directory_items.json\n@desc Get a public list of users\n@required {period: str(daily/weekly/monthly/quarterly/yearly/all), order: str(likes_received/likes_given/topic_count/post_count/topics_entered/posts_read/days_visited)}\n@optional {asc: str, page: int}\n@returns(200) {directory_items: [map], meta: map{last_updated_at: str?, total_rows_directory_items: int, load_more_directory_items: str}} # directory items response\n\n@endgroup\n\n@group admin\n@endpoint GET /admin/users/{id}.json\n@desc Get a user by id\n@required {id: int}\n@returns(200) {id: int, username: str, name: str?, avatar_template: str, active: bool, admin: bool, moderator: bool, last_seen_at: str?, last_emailed_at: str?, created_at: str, last_seen_age: num?, last_emailed_age: num?, created_at_age: num?, trust_level: int, manual_locked_trust_level: str?, title: str?, time_read: int, staged: bool, days_visited: int, posts_read_count: int, topics_entered: int, post_count: int, associated_accounts: [any], can_send_activation_email: bool, can_activate: bool, can_deactivate: bool, can_change_trust_level: bool, ip_address: str, registration_ip_address: str?, can_grant_admin: bool, can_revoke_admin: bool, can_grant_moderation: bool, can_revoke_moderation: bool, can_impersonate: bool, like_count: int, like_given_count: int, topic_count: int, flags_given_count: int, flags_received_count: int, private_topics_count: int, can_delete_all_posts: bool, can_be_deleted: bool, can_be_anonymized: bool, can_be_merged: bool, full_suspend_reason: str?, latest_export: map?, silence_reason: str?, post_edits_count: int?, primary_group_id: int?, badge_count: int, warnings_received_count: int, bounce_score: int?, reset_bounce_score_after: str?, can_view_action_logs: bool, can_disable_second_factor: bool, can_delete_sso_record: bool, api_key_count: int, similar_users_count: int, single_sign_on_record: str?, approved_by: map?, suspended_by: str?, silenced_by: str?, penalty_counts: map{silenced: int, suspended: int}, next_penalty: str, tl3_requirements: map{time_period: int, requirements_met: bool, requirements_lost: bool, trust_level_locked: bool, on_grace_period: bool, days_visited: int, min_days_visited: int, num_topics_replied_to: int, min_topics_replied_to: int, topics_viewed: int, min_topics_viewed: int, posts_read: int, min_posts_read: int, topics_viewed_all_time: int, min_topics_viewed_all_time: int, posts_read_all_time: int, min_posts_read_all_time: int, num_flagged_posts: int, max_flagged_posts: int, num_flagged_by_users: int, max_flagged_by_users: int, num_likes_given: int, min_likes_given: int, num_likes_received: int, min_likes_received: int, num_likes_received_days: int, min_likes_received_days: int, num_likes_received_users: int, min_likes_received_users: int, penalty_counts: map{silenced: int, suspended: int, total: int}}, groups: [map], external_ids: map, include_ip: bool, upcoming_changes_stats: [map]} # response\n\n@endpoint DELETE /admin/users/{id}.json\n@desc Delete a user\n@required {id: int}\n@optional {delete_posts: bool, block_email: bool, block_urls: bool, block_ip: bool}\n@returns(200) {deleted: bool} # response\n\n@endpoint PUT /admin/users/{id}/activate.json\n@desc Activate a user\n@required {id: int}\n@returns(200) {success: str} # response\n\n@endpoint PUT /admin/users/{id}/deactivate.json\n@desc Deactivate a user\n@required {id: int}\n@returns(200) {success: str} # response\n\n@endpoint PUT /admin/users/{id}/suspend.json\n@desc Suspend a user\n@required {id: int, suspend_until: str, reason: str}\n@optional {message: str # Will send an email with this message when present, post_action: str}\n@returns(200) {suspension: map{suspend_reason: str, full_suspend_reason: str, suspended_till: str, suspended_at: str, suspended_by: map{id: int, username: str, name: str, avatar_template: str}}} # response\n\n@endpoint PUT /admin/users/{id}/silence.json\n@desc Silence a user\n@required {id: int, silenced_till: str, reason: str}\n@optional {message: str # Will send an email with this message when present, post_action: str}\n@returns(200) {silence: map{silenced: bool, silence_reason: str, silenced_till: str, silenced_at: str, silenced_by: map{id: int, username: str, name: str, avatar_template: str}}} # response\n\n@endpoint PUT /admin/users/{id}/anonymize.json\n@desc Anonymize a user\n@required {id: int}\n@returns(200) {success: str, username: str} # response\n\n@endpoint POST /admin/users/{id}/log_out.json\n@desc Log a user out\n@required {id: int}\n@returns(200) {success: str} # response\n\n@endgroup\n\n@group user_avatar\n@endpoint POST /user_avatar/{username}/refresh_gravatar.json\n@desc Refresh gravatar\n@required {username: str}\n@returns(200) {gravatar_upload_id: int?, gravatar_avatar_template: str?} # response\n\n@endgroup\n\n@group admin\n@endpoint GET /admin/users.json\n@desc List users\n@optional {order: str(created/last_emailed/seen/username/email/trust_level/days_visited/posts_read/topics_viewed/posts/read_time), asc: str, page: int, show_emails: bool # Include user email addresses in response. These requests will be logged in the staff action logs., stats: bool # Include user stats information, email: str # Filter to the user with this email address, ip: str # Filter to users with this IP address}\n@returns(200) users response\n\n@endpoint GET /admin/users/list/{flag}.json\n@desc List users by flag\n@required {flag: str(active/new/staff/suspended/blocked/suspect)}\n@optional {order: str(created/last_emailed/seen/username/email/trust_level/days_visited/posts_read/topics_viewed/posts/read_time), asc: str, page: int, show_emails: bool # Include user email addresses in response. These requests will be logged in the staff action logs., stats: bool # Include user stats information, email: str # Filter to the user with this email address, ip: str # Filter to users with this IP address}\n@returns(200) response\n\n@endgroup\n\n@group user_actions.json\n@endpoint GET /user_actions.json\n@desc Get a list of user actions\n@required {offset: int, username: str, filter: str}\n@returns(200) {user_actions: [map]} # response\n\n@endgroup\n\n@group session\n@endpoint POST /session/forgot_password.json\n@desc Send password reset email\n@required {login: str}\n@returns(200) {success: str, user_found: bool} # success response\n\n@endgroup\n\n@group users\n@endpoint PUT /users/password-reset/{token}.json\n@desc Change password\n@required {token: str, username: str, password: str}\n@returns(200) success response\n\n@endgroup\n\n@group u\n@endpoint GET /u/{username}/emails.json\n@desc Get email addresses belonging to a user\n@required {username: str}\n@returns(200) {email: str, secondary_emails: [any], unconfirmed_emails: [any], associated_accounts: [any]} # success response\n\n@endgroup\n\n@end\n"}}