openapi: 3.0.0 info: description: 'Write API for NodeBB v2.0+' version: 31-03-2020 title: Write API contact: email: support@nodebb.org license: name: GPL-3.0 servers: - url: /api/v1 tags: - name: users description: 'Account related calls (create, modify, delete, etc.)' - name: categories description: Administrative calls to manage categories paths: /users/: post: tags: - users summary: creates a user account description: This operation creates a new user account requestBody: required: true content: application/json: schema: type: object properties: username: type: string description: 'If the username is taken, a number will be appended' password: type: string email: type: string required: - username example: username: Dragon Fruit password: s3cre7password email: dragonfruit@example.org responses: '200': description: user successfully created content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: '#/components/schemas/UserObj' '400': $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '426': $ref: '#/components/responses/426' '500': $ref: '#/components/responses/500' delete: tags: - users summary: deletes one or more users description: This operation deletes one or many user accounts, including their contributions (posts, topics, etc.) requestBody: required: true content: application/json: schema: type: object properties: uids: type: array description: A collection of uids items: type: number example: uids: - 1 - 2 - 3 responses: '200': description: user account(s) deleted content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object '/users/{uid}': put: tags: - users summary: updates a user account parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to update requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UserRequest' responses: '200': description: user profile updated content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: '#/components/schemas/UserObj' '401': $ref: '#/components/responses/401' '403': $ref: '#/components/responses/403' '426': $ref: '#/components/responses/426' '500': $ref: '#/components/responses/500' delete: tags: - users summary: delete a single user account parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to delete responses: '200': description: user account deleted content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object '/users/{uid}/password': put: tags: - users summary: changes a user's password parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to update requestBody: required: true content: application/json: schema: type: object properties: currentPassword: type: string description: test example: oldp455word newPassword: type: string example: s3cre7password required: - newPassword responses: '200': description: user profile updated content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object '/users/{uid}/follow': post: tags: - users summary: follows a user parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to follow responses: '200': description: successfully followed user content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object delete: tags: - users summary: unfollows a user parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to unfollow responses: '200': description: successfully unfollowed user content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object '/users/{uid}/ban': put: tags: - users summary: bans a user parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to ban requestBody: content: application/json: schema: type: object properties: until: type: number description: UNIX timestamp of the ban expiry example: 1585775608076 reason: type: string example: the reason for the ban responses: '200': description: successfully banned user content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object delete: tags: - users summary: unbans a user parameters: - in: path name: uid schema: type: integer required: true description: uid of the user to unban responses: '200': description: successfully unbanned user content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object /categories/: post: tags: - categories summary: creates a category description: This operation creates a new category requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: type: string parentCid: type: number cloneFromCid: type: number icon: type: string description: A ForkAwesome icon without the `fa-` prefix bgColor: type: string color: type: string link: type: string class: type: string backgroundImage: type: string required: - name example: name: My New Category description: Lorem ipsum, dolor sit amet parentCid: 0 cloneFromCid: 0 icon: bullhorn bgColor: '#ffffff' color: '#000000' link: 'https://example.org' class: 'col-md-3 col-xs-6' backgroundImage: '/assets/relative/path/to/image' responses: '200': description: category successfully created content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: '#/components/schemas/CategoryObj' /groups/: post: tags: - groups summary: Create a new group description: This operation creates a new group requestBody: required: true content: application/json: schema: type: object properties: name: type: string timestamp: type: number disableJoinRequests: type: number enum: [0, 1] disableLeave: type: number enum: [0, 1] hidden: type: number enum: [0, 1] ownerUid: type: number private: type: number enum: [0, 1] description: type: string userTitleEnabled: type: number enum: [0, 1] createtime: type: number required: - name example: name: 'My Test Group' hidden: 1 responses: '200': description: group successfully created content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: components/schemas/GroupObject.yaml#/GroupDataObject delete: tags: - groups summary: Delete an existing group description: This operation deletes an existing group, all members within this group will cease to be members after the group is deleted. responses: '200': description: group successfully deleted content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} /groups/{slug}/membership/{uid}: put: tags: - groups summary: Join a group description: This operation joins an existing group, or causes another user to join a group. If the group is private and you are not an administrator, this method will cause that user to request membership, instead. For user _invitations_, you'll want to call `PUT /groups/{slug}/invites/{uid}`. responses: '200': description: group successfully joined, or membership requested content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} /topics: post: tags: - topics summary: Create a new topic description: This operation creates a new topic with a post. Topic creation without a post is not allowed via the Write API as it is an internal-only method. requestBody: required: true content: application/json: schema: type: object properties: cid: type: number title: type: string content: type: string tags: type: array items: type: string required: - cid - title - content example: cid: 1 title: Test topic content: This is the test topic's content responses: '200': description: topic successfully created content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: components/schemas/TopicObject.yaml#/TopicObject /topics/{tid}: post: tags: - topics summary: Reply to a topic description: This operation creates a new reply to an existing topic. requestBody: required: true content: application/json: schema: type: object properties: content: type: string timestamp: type: number toPid: type: number required: - content example: content: This is a test reply responses: '200': description: post successfully created content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: $ref: components/schemas/PostsObject.yaml#/PostsObject delete: tags: - topics summary: Delete a topic description: This operation purges a topic and all of its posts (careful, there is no confirmation!) responses: '200': description: Topic successfully purged content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} /topics/{tid}/state: delete: tags: - topics summary: Delete a topic description: This operation deletes an existing topic. responses: '200': description: Topic successfully deleted content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} put: tags: - topics summary: Restore a topic description: This operation restores a topic. responses: '200': description: Topic successfully restored content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} /topics/{tid}/lock: delete: tags: - topics summary: Lock a topic description: This operation locks an existing topic. responses: '200': description: Topic successfully locked content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} put: tags: - topics summary: Unlock a topic description: This operation unlocks a topic. responses: '200': description: Topic successfully unlocked content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} /topics/{tid}/state: delete: tags: - topics summary: Pin a topic description: This operation pins an existing topic. responses: '200': description: Topic successfully pinned content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} put: tags: - topics summary: Unpin a topic description: This operation unpins a topic. responses: '200': description: Topic successfully unpinned content: application/json: schema: type: object properties: status: $ref: '#/components/schemas/Status' response: type: object properties: {} components: schemas: Status: type: object properties: code: type: string example: ok message: type: string example: OK Error: type: object properties: status: type: object properties: code: type: string message: type: string response: type: object UserObj: properties: uid: type: number example: 1 username: type: string example: Dragon Fruit userslug: type: string example: dragon-fruit email: type: string example: dragonfruit@example.org 'email:confirmed': type: number example: 1 joindate: type: number example: 1585337827953 lastonline: type: number example: 1585337827953 picture: type: string example: 'https://images.unsplash.com/photo-1560070094-e1f2ddec4337?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=256&h=256&q=80' fullname: type: string example: Mr. Dragon Fruit Jr. location: type: string example: 'Toronto, Canada' birthday: type: string description: A birthdate given in an ISO format parseable by the Date object example: 03/27/2020 website: type: string example: 'https://example.org' aboutme: type: string example: | This is a paragraph all about how my life got twist-turned upside-down and I'd like to take a minute and sit right here, to tell you all about how I because the administrator of NodeBB signature: type: string example: | This is an example signature It can span multiple lines. uploadedpicture: type: string example: /assets/profile/1-profileimg.png description: 'In almost all cases, defer to "picture" instead. Use this if you need to specifically reference the picture uploaded to the forum.' profileviews: type: number example: 1000 reputation: type: number example: 100 postcount: type: number example: 1000 topiccount: type: number example: 50 lastposttime: type: number example: 1585337827953 banned: type: number example: 0 'banned:expire': type: number example: 1585337827953 status: type: string example: online flags: type: number example: 0 followercount: type: number example: 2 followingcount: type: number example: 5 'cover:url': type: string example: /assets/profile/1-cover.png 'cover:position': type: string example: 50.0301% 19.2464% groupTitle: type: string example: '["administrators","Staff"]' groupTitleArray: type: array example: - administrators - Staff 'icon:text': type: string example: D 'icon:bgColor': type: string example: '#9c27b0' joindateISO: type: string example: '2020-03-27T20:30:36.590Z' lastonlineISO: type: string example: '2020-03-27T20:30:36.590Z' banned_until: type: number example: 0 banned_until_readable: type: string example: Not Banned UserRequest: properties: username: type: string example: Dragon Fruit email: type: string example: dragonfruit@example.org fullname: type: string example: Mr. Dragon Fruit Jr. website: type: string example: 'https://example.org' location: type: string example: 'Toronto, Canada' groupTitle: type: string example: '["administrators","Staff"]' birthday: type: string description: A birthdate given in an ISO format parseable by the Date object example: 03/27/2020 signature: type: string example: | This is an example signature It can span multiple lines. aboutme: type: string example: | This is a paragraph all about how my life got twist-turned upside-down and I'd like to take a minute and sit right here, to tell you all about how I because the administrator of NodeBB CategoryObj: properties: cid: type: number example: 1 name: type: string example: My New Category description: type: string example: Lorem ipsum, dolor sit amet descriptionParsed: type: string example: Lorem ipsum, dolor sit amet icon: type: string example: bullhorn bgColor: type: string example: '#ffffff' color: type: string example: '#000000' slug: type: string example: 1/my-new-category parentCid: type: number example: 0 topic_count: type: number example: 0 post_count: type: number example: 0 disabled: type: number example: 0 order: type: number example: 5 link: type: number example: 'https://example.org' numRecentReplies: type: number example: 1 class: type: string example: col-md-3 col-xs-6 imageClass: type: string example: cover isSection: type: number example: 0 totalPostCount: type: number example: 0 totalTopicCount: type: number example: 0 tagWhitelist: type: array example: - some-tag - another-tag unread-class: type: string backgroundImage: type: string example: '/assets/images/covers/Circuit1.png' responses: '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Not Authorized content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' '426': description: Upgrade Required content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Error'