openapi: 3.0.1 info: title: Prosody administration API description: Prosody administration API contact: email: developers@prosody.im license: name: MIT url: https://prosody.im/source/mit version: 1.0.0 servers: - url: /admin_api tags: - name: user description: Manage user accounts - name: invite description: Pending invitations - name: group description: User groups paths: /users: get: tags: - user summary: List users description: Returns an array of users. operationId: listUsers responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/UserList' /users/{username}: get: tags: - user summary: Get user by user name operationId: getUserByName parameters: - name: username in: path description: The name that needs to be fetched required: true schema: type: string responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/User' 400: description: Invalid username supplied content: {} 404: description: User not found content: {} put: tags: - user summary: Updated user description: Update a user operationId: updateUser parameters: - name: username in: path description: user that need to be updated required: true schema: type: string requestBody: description: Updated user object content: '*/*': schema: $ref: '#/components/schemas/User' required: true responses: 400: description: Invalid user supplied content: {} 404: description: User not found content: {} x-codegen-request-body-name: body delete: tags: - user summary: Delete user description: Delete a user account operationId: deleteUser parameters: - name: username in: path description: The name that needs to be deleted required: true schema: type: string responses: 400: description: Invalid username supplied content: {} 404: description: User not found content: {} /users/{username}/groups: get: tags: - user summary: List groups that user is a member of operationId: getUserGroups parameters: - name: username in: path description: The name of the user to fetch required: true schema: type: string responses: 200: description: Returns an array of group IDs that the user belongs to content: application/json: schema: type: array description: "An array of group IDs that the user belongs to" items: type: string description: "Group ID" 400: description: Invalid username supplied content: {} 404: description: User not found content: {} /users/{username}/debug: get: tags: - user summary: Get user debug info operationId: getUserDebugInfo parameters: - name: username in: path description: The name of the user to fetch required: true schema: type: string responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/UserDebugInfo' 400: description: Invalid username supplied content: {} 404: description: User not found content: {} /invites: get: tags: - invite summary: List invites description: Returns an array of users. operationId: listInvites responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/InviteList' /invites/account: post: tags: - invite summary: Create invitation to register a new account description: Creates a new invitation operationId: createInviteForAccount requestBody: description: "Invite parameters (optional)" required: false content: application/json: schema: $ref: "#/components/schemas/NewAccountInvite" responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Invite' /invites/group: post: tags: - invite summary: Create group invitation description: | Creates a new group invitation. Group invitations may be shared with multiple people and each account created via a group invitation will automatically be contacts of every other account created through the same invitation. You can create an invitation to an existing group by including the existing group's id in the 'group' property of the request. If no existing group is specified, a new one will be created automatically (using the 'group_options' property as a template if provided). If no 'ttl' is specified then the invitation link will be valid until it is manually revoked. operationId: createInviteForGroup requestBody: description: "Invite parameters (optional)" required: false content: application/json: schema: $ref: "#/components/schemas/NewGroupInvite" responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Invite' /invites/reset: post: tags: - invite summary: Create account reset invitation description: | Creates a new invitation to reset the specified account. The created link is valid for a shorter time period (24 hours) by default and should only be shared securely with the user who owns the account. The returned link will allow the user to regain access to their account, for example if they have lost their password. operationId: createInviteForAccountReset requestBody: description: "Invite parameters" required: true content: application/json: schema: $ref: "#/components/schemas/NewResetInvite" responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Invite' /invites/{id}: get: tags: - invite summary: Get invite by id operationId: getInviteById parameters: - name: id in: path description: The id of the invite to fetch required: true schema: type: string responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Invite' 404: description: Invite not found content: {} delete: tags: - invite summary: Delete invite description: Delete a pending invite operationId: deleteInvite parameters: - name: id in: path description: The id of the invite to be deleted required: true schema: type: string responses: 404: description: Invite not found content: {} /groups: get: tags: - group summary: List groups description: Returns an array of groups. operationId: listGroups responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/GroupList' post: tags: - group summary: Create group description: Creates a new user group operationId: createGroup requestBody: description: "Group parameters" required: true content: application/json: schema: $ref: "#/components/schemas/NewGroup" responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Group' /groups/{id}: get: tags: - group summary: Get group by id operationId: getGroupById parameters: - name: id in: path description: The id of the group to fetch required: true schema: type: string responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/Group' 404: description: Group not found content: {} delete: tags: - group summary: Delete group description: Delete a group (does not delete users or existing subscriptions) operationId: deleteGroup parameters: - name: id in: path description: The id of the group to be deleted required: true schema: type: string responses: 404: description: Group not found /groups/{id}/members/{username}: put: tags: - group summary: Create group membership operationId: addGroupMember parameters: - name: id in: path description: The id of the group to modify required: true schema: type: string - name: username in: path description: The username to add to the group required: true schema: type: string responses: 200: description: successful operation 404: description: Group not found delete: tags: - group summary: Delete a group membership operationId: deleteGroupMember parameters: - name: id in: path description: The id of the group to modify required: true schema: type: string - name: username in: path description: The username to remove from the group required: true schema: type: string responses: 200: description: successful operation 404: description: Group not found /server/info: get: tags: - server summary: Get information about the server operationId: getServerInfo responses: 200: description: successful operation content: application/json: schema: $ref: '#/components/schemas/ServerInfo' components: schemas: UserList: type: array items: $ref: '#/components/schemas/User' User: type: object properties: username: type: string description: XMPP username of the user display_name: type: string description: Display name of the user nullable: true email: type: string description: Optional email address for the user (NYI) nullable: true phone: type: string description: Optional phone number for the user (NYI) nullable: true groups: type: array description: List of group IDs user is a member of items: type: string description: Group ID InviteList: type: array items: $ref: '#/components/schemas/Invite' Invite: type: object properties: id: type: string description: Unique ID of the invite type: type: string description: The type (action) of the invite (register, roster, etc.) reusable: type: boolean description: Whether the invite may be used more than once (until expiry or revocation) inviter: type: string description: (Optional) JID of the inviter nullable: true jid: type: string description: The JID of the invite, interpretation varies based by invite type token: type: string description: Invite token uri: type: string description: XMPP URI of the invite landing_page: type: string description: HTTPS URL of invite page (use in preference to XMPP URI when available) nullable: true created_at: type: integer description: Unix timestamp of invite creation expires: type: integer description: Unix timestamp of invite expiration groups: type: array description: Array of group IDs that an accepting user will be added to items: type: string description: Group ID source: type: string description: | String that identifies how and by whom the invite was created. Invites created by this API will have the source string 'admin_api/USERNAME', where USERNAME is the name of the user that requested creation of the invite. reset: type: boolean description: "Indicates that this is an account reset for the account identified by 'username'" NewAccountInvite: type: object properties: username: type: string description: Optionally restrict the registered account to the specified username nullable: true ttl: type: number description: The time in seconds that the invitation will be valid for (uses a sensible default if not provided). nullable: true groups: type: array nullable: true description: "IDs of existing groups to add the new account to" items: type: string description: "Group ID" NewGroupInvite: type: object properties: ttl: type: number description: Specify that the invitation will only be valid for the specified number of seconds. If not provided, the invitation will be valid until it is manually deleted. groups: type: array nullable: true items: type: string description: "Group ID" description: "IDs of existing group to add the new accounts to" group_options: $ref: '#/components/schemas/NewGroup' NewResetInvite: type: object properties: username: type: string description: "Username of the account to create a password reset link for" ttl: type: number description: Time in seconds that the link will be valid. Defaults to 24 hours. nullable: true NewGroup: type: object properties: name: type: string description: "Display name of the group" create_muc: type: boolean description: Create a MUC associated with the group Group: type: object properties: id: type: string description: id of the group name: type: string description: Display name of the group muc_jid: type: string nullable: true description: JID of the associated MUC, if any. GroupList: type: array items: $ref: '#/components/schemas/Group' UserDebugInfo: type: object properties: sessions: type: array items: $ref: '#/components/schemas/UserDebugSessionInfo' push_registrations: $ref: '#/components/schemas/UserDebugPushRegistrations' omemo: $ref: '#/components/schemas/UserDebugOmemo' UserDebugSessionInfo: type: object properties: full_jid: type: string description: "Full JID of the session" ip: type: string description: "IP address of the session, human-readable" nullable: true since: type: integer description: "Unix timestamp of session establishment" status: type: object properties: connected: type: boolean description: "Whether the session is connected" hibernating: type: boolean description: "Whether the session is waiting to be resumed" active: type: boolean description: "Whether the session is active (CSI)" nullable: true features: type: object properties: encrypted: type: boolean description: "Whether the session enabled transport encryption" carbons: type: boolean description: "Whether the session enabled carbons" acks: type: boolean description: "Whether the session enabled acknowledgements" resumption: type: boolean description: "Whether the session enabled resumption" mobile_optimization: type: boolean description: "Whether the session enabled mobile optimizations" push_notifications: type: boolean description: "Whether the session enabled push notifications" history: type: boolean description: "Whether the session requested history" queues: type: object properties: held_stanzas: type: integer description: "Number of stanzas held due to mobile optimizations" nullable: true awaiting_acks: type: integer description: "Number of stanzas awaiting acknowledgement" nullable: true push_info: type: object nullable: true properties: id: type: string description: "ID of the push registration used by this session" wakeup_push_sent: type: integer description: "Unix timestamp of the first wakeup push sent (if any)" nullable: true UserDebugPushRegistrations: type: object description: | Push registrations of the user. The key of the object is the registration identifier. If a session is using a push registration, this identifier is found in `session.push_info.id`. It is possible to have push registrations with no active sessions attached. properties: since: type: integer description: "Unix timestamp of creation of this registration" service: type: string description: "The JID of the push service that notifications will be sent to" node: type: string description: "The identifier/token that the remote push service assigned to this registration." error_count: type: number description: "A count of recent errors for this push registration (reset on successful push)." UserDebugOmemo: type: object description: "Information about user's published OMEMO devices and keys" properties: status: type: object description: "Status of the OMEMO device list" properties: valid: type: boolean description: "Indicates whether the overall OMEMO configuration appears to be valid (including all devices)" config_valid: type: boolean description: "Indicates whether configuration of the device list appears to be valid" devices: type: array items: type: object description: "OMEMO device descriptor" properties: id: type: integer description: "The integer OMEMO device id of this device. May be missing if invalid." nullable: true have_bundle: type: boolean description: "True when a matching descriptor (bundle) is found for this device." valid: type: boolean description: "Whether the bundle config appears to be valid." ServerInfo: type: object description: Information about the current server properties: site_name: type: string description: A friendly name for the service version: type: string description: A human-readable version string