openapi: 3.0.3 info: title: Ticketing System API version: 1.0.0 servers: - description: Ticketing System API url: '{scheme}://{address}:{port}' variables: address: default: localhost port: default: "8081" scheme: default: http enum: - https - http paths: /tickets: get: summary: List all tickets operationId: listTickets parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of tickets", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedTicket" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tickets" } } } security: [ { OAuth2: [ "ticket:read" ] } ] post: summary: Create a new ticket operationId: createTicket requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTicket" } } } } responses: "200": { "description": "Ticket created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ticket" } } } } security: [ { "OAuth2": [ "ticket:write" ] } ] /tickets/{id}: get: summary: Get a single ticket by ID operationId: getTicket parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single ticket", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedTicket" } } } } security: [ { OAuth2: [ "ticket:read" ] } ] patch: summary: Update a ticket by ID operationId: updateTicket parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TicketUpdate" } } } } responses: "200": { "description": "Tickets updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ticket" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] delete: summary: Delete a ticket by ID operationId: deleteTicket parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Tickets deleted" } security: [ { OAuth2: [ "ticket:write" ] } ] /comments: get: summary: List all comments operationId: listComments parameters: - { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of comments", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedComment" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of comments" } } } security: [ { "OAuth2": [ "ticket:read" ] } ] post: summary: Create a new comment operationId: createComment requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewComment" } } } } responses: "200": { "description": "Comment created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Comment" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] /comments/{id}: get: summary: Get a single comment by ID operationId: getComment parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single comment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedComment" } } } } security: [ { OAuth2: [ "ticket:read" ] } ] patch: summary: Update a comment by ID operationId: updateComment parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentUpdate" } } } } responses: "200": { "description": "Comment updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Comment" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] delete: summary: Delete a comment by ID operationId: deleteComment parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Comment deleted" } security: [ { OAuth2: [ "ticket:write" ] } ] /files: get: summary: List all files operationId: listFiles parameters: - { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of files", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/File" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of files" } } } security: [ { OAuth2: [ "file:read" ] } ] post: summary: Create a new file operationId: createFile requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewFile" } } } } responses: "200": { "description": "File created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/File" } } } } security: [ { OAuth2: [ "file:write" ] } ] /files/{id}: get: summary: Get a single file by ID operationId: getFile parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single file", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/File" } } } } security: [ { OAuth2: [ "file:read" ] } ] delete: summary: Delete a file by ID operationId: deleteFile parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "File deleted" } security: [ { OAuth2: [ "file:write" ] } ] /files/{id}/download: get: summary: Download a file by ID operationId: downloadFile parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "File content", "content": { "application/octet-stream": { } }, "headers": { "Content-Disposition": { "schema": { "type": "string" } }, "Content-Type": { "schema": { "type": "string" } } } } security: [ { OAuth2: [ "file:read" ] } ] /links: get: summary: List all links operationId: listLinks parameters: - { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of links", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Link" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of links" } } } security: [ { OAuth2: [ "ticket:read" ] } ] post: summary: Create a new link operationId: createLink requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewLink" } } } } responses: "200": { "description": "Link created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] /links/{id}: get: summary: Get a single link by ID operationId: getLink parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single link", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } } security: [ { OAuth2: [ "ticket:read" ] } ] patch: summary: Update a link by ID operationId: updateLink parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LinkUpdate" } } } } responses: "200": { "description": "Link updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] delete: summary: Delete a link by ID operationId: deleteLink parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Link deleted" } security: [ { OAuth2: [ "ticket:write" ] } ] /tasks: get: summary: List all tasks operationId: listTasks parameters: - { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of tasks", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedTask" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tasks" } } } security: [ { OAuth2: [ "ticket:read" ] } ] post: summary: Create a new task operationId: createTask requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTask" } } } } responses: "200": { "description": "Task created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Task" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] /tasks/{id}: get: summary: Get a single task by ID operationId: getTask parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single task", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedTask" } } } } security: [ { OAuth2: [ "ticket:read" ] } ] patch: summary: Update a task by ID operationId: updateTask parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskUpdate" } } } } responses: "200": { "description": "Task updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Task" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] delete: summary: Delete a task by ID operationId: deleteTask parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Task deleted" } security: [ { OAuth2: [ "ticket:write" ] } ] /timeline: get: summary: List all timeline items operationId: listTimeline parameters: - { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of timeline items", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/TimelineEntry" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of timeline items" } } } security: [ { OAuth2: [ "ticket:read" ] } ] post: summary: Create a new timeline item operationId: createTimeline requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTimelineEntry" } } } } responses: "200": { "description": "Timeline item created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] /timeline/{id}: get: summary: Get a single timeline item by ID operationId: getTimeline parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single timeline item", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } } security: [ { OAuth2: [ "ticket:read" ] } ] patch: summary: Update a timeline item by ID operationId: updateTimeline parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntryUpdate" } } } } responses: "200": { "description": "Timeline item updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } } security: [ { OAuth2: [ "ticket:write" ] } ] delete: summary: Delete a timeline item by ID operationId: deleteTimeline parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Timeline item deleted" } security: [ { OAuth2: [ "ticket:write" ] } ] /reactions: get: summary: List all reactions operationId: listReactions parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of reactions", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Reaction" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of reactions" } } } security: [ { OAuth2: [ "reaction:read" ] } ] post: summary: Create a new reaction operationId: createReaction requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewReaction" } } } } responses: "200": { "description": "Reactions created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } } security: [ { OAuth2: [ "reaction:write" ] } ] /reactions/{id}: get: summary: Get a single reaction by ID operationId: getReaction parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single reaction", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } } security: [ { OAuth2: [ "reaction:read" ] } ] patch: summary: Update a reaction by ID operationId: updateReaction parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReactionUpdate" } } } } responses: "200": { "description": "Reactions updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } } security: [ { OAuth2: [ "reaction:write" ] } ] delete: summary: Delete a reaction by ID operationId: deleteReaction parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Reactions deleted" } security: [ { OAuth2: [ "reaction:write" ] } ] /types: get: summary: List all types operationId: listTypes parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of types", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Type" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of types" } } } security: [ { OAuth2: [ "type:read" ] } ] post: summary: Create a new type operationId: createType requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewType" } } } } responses: "200": { "description": "Types created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } } security: [ { OAuth2: [ "type:write" ] } ] /types/{id}: get: summary: Get a single type by ID operationId: getType parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single type", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } } security: [ { OAuth2: [ "type:read" ] } ] patch: summary: Update a type by ID operationId: updateType parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TypeUpdate" } } } } responses: "200": { "description": "Types updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } } security: [ { OAuth2: [ "type:write" ] } ] delete: summary: Delete a type by ID operationId: deleteType parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Types deleted" } security: [ { OAuth2: [ "type:write" ] } ] /users: get: summary: List all users operationId: listUsers parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/User" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of users" } } } security: [ { OAuth2: [ "user:read" ] } ] post: summary: Create a new user operationId: createUser requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewUser" } } } } responses: "200": { "description": "Users created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } } security: [ { OAuth2: [ "user:write" ] } ] /users/{id}: get: summary: Get a single user by ID operationId: getUser parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single user", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } } security: [ { OAuth2: [ "user:read" ] } ] patch: summary: Update a user by ID operationId: updateUser parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdate" } } } } responses: "200": { "description": "Users updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } } security: [ { OAuth2: [ "user:write" ] } ] delete: summary: Delete a user by ID operationId: deleteUser parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Users deleted" } security: [ { OAuth2: [ "user:write" ] } ] /users/{id}/groups: get: summary: List all groups for a user operationId: listUserGroups parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of user groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } } security: [ { OAuth2: [ "user:read" ] } ] post: summary: Add a group to a user operationId: addUserGroup parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupRelation" } } } } responses: "201": { "description": "Group added to user" } security: [ { OAuth2: [ "user:write" ] } ] /users/{id}/permissions: get: summary: List all permissions for a user operationId: listUserPermissions parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of user permissions", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } } security: [ { OAuth2: [ "user:read" ] } ] /users/{id}/groups/{groupId}: delete: summary: Remove a group from a user operationId: removeUserGroup parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } - { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Group removed from user" } security: [ { OAuth2: [ "user:write" ] } ] /groups: get: summary: List all groups operationId: listGroups parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Group" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of groups" } } } security: [ { OAuth2: [ "group:read" ] } ] post: summary: Create a new group operationId: createGroup requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewGroup" } } } } responses: "200": { "description": "Groups created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } } security: [ { OAuth2: [ "group:write" ] } ] /groups/{id}: get: summary: Get a single group by ID operationId: getGroup parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single group", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } } security: [ { OAuth2: [ "group:read" ] } ] patch: summary: Update a group by ID operationId: updateGroup parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupUpdate" } } } } responses: "200": { "description": "Groups updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } } security: [ { OAuth2: [ "group:write" ] } ] delete: summary: Delete a group by ID operationId: deleteGroup parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Groups deleted" } security: [ { OAuth2: [ "group:write" ] } ] /groups/{id}/parents: get: summary: List all parent groups for a group operationId: listParentGroups parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of group groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } } security: [ { OAuth2: [ "group:read" ] } ] post: summary: Add a parent group to another group operationId: addGroupParent parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupRelation" } } } } responses: "201": { "description": "Group added to group" } security: [ { OAuth2: [ "group:write" ] } ] /groups/{id}/children: get: summary: List all child groups for a group operationId: listChildGroups parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of group groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } } security: [ { OAuth2: [ "group:read" ] } ] /groups/{id}/users: get: summary: List all users for a group operationId: listGroupUsers parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of group users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/GroupUser" } } } } } security: [ { OAuth2: [ "group:read" ] } ] /groups/{id}/permissions: get: summary: List all permissions for a group operationId: listParentPermissions parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A list of group permissions", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } } security: [ { OAuth2: [ "group:read" ] } ] /groups/{id}/groups/{parentGroupId}: delete: summary: Remove a parent group from another group operationId: removeGroupParent parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } - { "name": "parentGroupId", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Group removed from group" } security: [ { OAuth2: [ "group:write" ] } ] /webhooks: get: summary: List all webhooks operationId: listWebhooks parameters: - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "A list of webhooks", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Webhook" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of webhooks" } } } security: [ { OAuth2: [ "webhook:read" ] } ] post: summary: Create a new webhook operationId: createWebhook requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewWebhook" } } } } responses: "200": { "description": "Webhooks created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } } security: [ { OAuth2: [ "webhook:write" ] } ] /webhooks/{id}: get: summary: Get a single webhook by ID operationId: getWebhook parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "200": { "description": "A single webhook", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } } security: [ { OAuth2: [ "webhook:read" ] } ] patch: summary: Update a webhook by ID operationId: updateWebhook parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookUpdate" } } } } responses: "200": { "description": "Webhooks updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } } security: [ { OAuth2: [ "webhook:write" ] } ] delete: summary: Delete a webhook by ID operationId: deleteWebhook parameters: - { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } } responses: "204": { "description": "Webhooks deleted" } security: [ { OAuth2: [ "webhook:write" ] } ] /dashboard_counts: get: summary: Get dashboard summary counts operationId: getDashboardCounts responses: "200": { "description": "Dashboard count data", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/DashboardCounts" } } } } } security: [ { OAuth2: [ "ticket:read" ] } ] /sidebar: get: summary: Get sidebar data operationId: getSidebar responses: "200": { "description": "Sidebar content", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Sidebar" } } } } } security: [ { OAuth2: [ "ticket:read" ] } ] /ticket_search: get: summary: Search tickets with full join data operationId: searchTickets parameters: - { "name": "query", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "type", "in": "query", "required": false, "schema": { "type": "string" } } - { "name": "open", "in": "query", "required": false, "schema": { "type": "boolean" } } - { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } } - { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } } responses: "200": { "description": "Search results with aggregated data", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/TicketSearch" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tickets" } } } security: [ { OAuth2: [ "ticket:read" ] } ] /settings: get: summary: Get system settings operationId: getSettings responses: "200": { "description": "System settings", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } } security: [ { OAuth2: [ "settings:read" ] } ] post: summary: Update system settings operationId: updateSettings requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } } responses: "200": { "description": "Settings updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } } security: [ { OAuth2: [ "settings:write" ] } ] /config: get: summary: Get the configuration operationId: getConfig responses: "200": { "description": "The configuration", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Config" } } } } components: schemas: NewComment: type: object properties: ticket: { "type": "string" } author: { "type": "string" } message: { "type": "string" } required: [ "ticket", "author", "message" ] CommentUpdate: type: object properties: author: { "type": "string" } message: { "type": "string" } Comment: type: object properties: id: { "type": "string" } ticket: { "type": "string" } author: { "type": "string" } message: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "author", "message", "created", "updated" ] ExtendedComment: type: object properties: id: { "type": "string" } ticket: { "type": "string" } author: { "type": "string" } message: { "type": "string" } author_name: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "author", "message", "author_name", "created", "updated" ] NewFeature: type: object properties: name: { "type": "string" } required: [ "name" ] Feature: type: object properties: id: { "type": "string" } name: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "name", "created", "updated" ] NewFile: type: object properties: ticket: { "type": "string" } blob: { "type": "string" } name: { "type": "string" } required: [ "ticket", "blob", "name" ] FileUpdate: type: object properties: name: { "type": "string" } File: type: object properties: id: { "type": "string" } ticket: { "type": "string" } name: { "type": "string" } size: { "type": "number", "format": "double" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "name", "size", "created", "updated" ] NewLink: type: object properties: ticket: { "type": "string" } name: { "type": "string" } url: { "type": "string" } required: [ "ticket", "name", "url" ] LinkUpdate: type: object properties: name: { "type": "string" } url: { "type": "string" } Link: type: object properties: id: { "type": "string" } ticket: { "type": "string" } name: { "type": "string" } url: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "name", "url", "created", "updated" ] NewReaction: type: object properties: name: { "type": "string" } action: { "type": "string" } actiondata: { "type": "object" } trigger: { "type": "string" } triggerdata: { "type": "object" } required: [ "name", "action", "actiondata", "trigger", "triggerdata" ] ReactionUpdate: type: object properties: name: { "type": "string" } action: { "type": "string" } actiondata: { "type": "object" } trigger: { "type": "string" } triggerdata: { "type": "object" } Reaction: type: object properties: id: { "type": "string" } name: { "type": "string" } action: { "type": "string" } actiondata: { "type": "object" } trigger: { "type": "string" } triggerdata: { "type": "object" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "name", "action", "actiondata", "trigger", "triggerdata", "created", "updated" ] NewTask: type: object properties: ticket: { "type": "string" } name: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } required: [ "ticket", "name", "open" ] TaskUpdate: type: object properties: name: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } Task: type: object properties: id: { "type": "string" } ticket: { "type": "string" } name: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "name", "open", "created", "updated" ] ExtendedTask: type: object properties: id: { "type": "string" } ticket: { "type": "string" } name: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } owner_name: { "type": "string" } ticket_name: { "type": "string" } ticket_type: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "name", "open", "ticket_name", "ticket_type", "created", "updated" ] NewTicket: type: object properties: type: { "type": "string" } name: { "type": "string" } description: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } resolution: { "type": "string" } schema: { "type": "object" } state: { "type": "object" } required: [ "type", "name", "description", "open", "schema", "state" ] TicketUpdate: type: object properties: type: { "type": "string" } name: { "type": "string" } description: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } resolution: { "type": "string" } schema: { "type": "object" } state: { "type": "object" } Ticket: type: object properties: id: { "type": "string" } type: { "type": "string" } name: { "type": "string" } description: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } resolution: { "type": "string" } schema: { "type": "object" } state: { "type": "object" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "type", "name", "description", "open", "schema", "state", "created", "updated" ] ExtendedTicket: type: object properties: id: { "type": "string" } type: { "type": "string" } name: { "type": "string" } description: { "type": "string" } open: { "type": "boolean" } owner: { "type": "string" } resolution: { "type": "string" } schema: { "type": "object" } state: { "type": "object" } owner_name: { "type": "string" } type_singular: { "type": "string" } type_plural: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "type", "name", "description", "open", "schema", "state", "type_singular", "type_plural", "created", "updated" ] NewTimelineEntry: type: object properties: ticket: { "type": "string" } message: { "type": "string" } time: { "type": "string", "format": "date-time" } required: [ "ticket", "message", "time" ] TimelineEntryUpdate: type: object properties: message: { "type": "string" } time: { "type": "string", "format": "date-time" } TimelineEntry: type: object properties: id: { "type": "string" } ticket: { "type": "string" } message: { "type": "string" } time: { "type": "string", "format": "date-time" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "ticket", "message", "time", "created", "updated" ] NewType: type: object properties: icon: { "type": "string" } plural: { "type": "string" } schema: { "type": "object" } singular: { "type": "string" } required: [ "singular", "plural", "schema" ] TypeUpdate: type: object properties: icon: { "type": "string" } plural: { "type": "string" } schema: { "type": "object" } singular: { "type": "string" } Type: type: object properties: id: { "type": "string" } icon: { "type": "string" } plural: { "type": "string" } schema: { "type": "object" } singular: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "plural", "schema", "singular", "created", "updated" ] NewUser: type: object properties: username: { "type": "string" } avatar: { "type": "string" } email: { "type": "string" } name: { "type": "string" } active: { "type": "boolean" } required: [ "username", "active" ] UserUpdate: type: object properties: username: { "type": "string" } avatar: { "type": "string" } email: { "type": "string" } name: { "type": "string" } password: { "type": "string" } passwordConfirm: { "type": "string" } active: { "type": "boolean" } User: type: object properties: id: { "type": "string" } username: { "type": "string" } avatar: { "type": "string" } email: { "type": "string" } lastResetSentAt: { "type": "string", "format": "date-time" } lastVerificationSentAt: { "type": "string", "format": "date-time" } name: { "type": "string" } active: { "type": "boolean" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "username", "active", "created", "updated" ] NewGroup: type: object properties: name: { "type": "string" } permissions: { "type": "array", "items": { "type": "string" } } required: [ "name", "permissions" ] GroupUpdate: type: object properties: name: { "type": "string" } permissions: { "type": "array", "items": { "type": "string" } } Group: type: object properties: id: { "type": "string" } name: { "type": "string" } permissions: { "type": "array", "items": { "type": "string" } } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "name", "permissions", "created", "updated" ] UserGroup: type: object properties: id: { "type": "string" } name: { "type": "string" } permissions: { "type": "array", "items": { "type": "string" } } type: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "name", "permissions", "type", "created", "updated" ] GroupUser: type: object properties: id: { "type": "string" } username: { "type": "string" } avatar: { "type": "string" } email: { "type": "string" } lastResetSentAt: { "type": "string", "format": "date-time" } lastVerificationSentAt: { "type": "string", "format": "date-time" } name: { "type": "string" } active: { "type": "boolean" } type: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "username", "active", "type", "created", "updated" ] GroupRelation: type: object properties: group_id: { "type": "string" } required: [ "group_id" ] NewWebhook: type: object properties: name: { "type": "string" } collection: { "type": "string" } destination: { "type": "string" } required: [ "name", "collection", "destination" ] WebhookUpdate: type: object properties: name: { "type": "string" } collection: { "type": "string" } destination: { "type": "string" } Webhook: type: object properties: id: { "type": "string" } name: { "type": "string" } collection: { "type": "string" } destination: { "type": "string" } created: { "type": "string", "format": "date-time" } updated: { "type": "string", "format": "date-time" } required: [ "id", "name", "collection", "destination", "created", "updated" ] DashboardCounts: type: object properties: id: { "type": "string" } count: { "type": "integer" } required: [ "id", "count" ] Sidebar: type: object properties: id: { "type": "string" } singular: { "type": "string" } plural: { "type": "string" } icon: { "type": "string" } count: { "type": "integer" } required: [ "id", "singular", "plural", "count" ] TicketSearch: type: object properties: id: { "type": "string" } name: { "type": "string" } description: { "type": "string" } open: { "type": "boolean" } type: { "type": "string" } state: { "type": "object" } owner_name: { "type": "string" } created: { "type": "string", "format": "date-time" } required: [ "id", "name", "description", "open", "type", "state", "owner_name", "created" ] Config: type: object properties: flags: { "type": "array", "items": { "type": "string" } } permissions: { "type": "array", "items": { "type": "string" } } tables: { "type": "array", "items": { "$ref": "#/components/schemas/Table" } } required: [ "flags", "permissions", "tables" ] Table: type: object properties: id: { "type": "string" } name: { "type": "string" } required: [ "id", "name" ] Settings: type: object properties: meta: $ref: '#/components/schemas/SettingsMeta' smtp: $ref: '#/components/schemas/SettingsSmtp' required: [ "meta", "smtp" ] SettingsMeta: type: object properties: app_name: type: string app_url: type: string sender_name: type: string sender_address: type: string reset_password_template: $ref: '#/components/schemas/EmailTemplate' required: [ "app_name", "app_url", "sender_name", "sender_address", "reset_password_template" ] SettingsSmtp: type: object properties: enabled: type: boolean host: type: string port: type: integer username: type: string password: type: string auth_method: type: string tls: type: boolean local_name: type: string required: [ "enabled", "host", "port", "username", "password", "auth_method", "tls", "local_name" ] EmailTemplate: type: object properties: body: type: string subject: type: string required: [ "body", "subject" ] Error: type: object properties: status: { "type": "integer" } error: { "type": "string" } message: { "type": "string" } required: [ "status", "error", "message" ] securitySchemes: OAuth2: type: oauth2 flows: authorizationCode: authorizationUrl: /oauth/authorize tokenUrl: /oauth/token scopes: user:read: Read user data user:write: Write user data group:read: Read group data group:write: Write group data ticket:read: Read ticket data ticket:write: Write ticket data comment:read: Read comment data comment:write: Write comment data file:read: Read file data file:write: Write file data link:read: Read link data link:write: Write link data reaction:read: Read reaction data reaction:write: Write reaction data task:read: Read task data task:write: Write task data feature:read: Read feature data feature:write: Write feature data webhook:read: Read webhook data webhook:write: Write webhook data settings:read: Read settings data settings:write: Write settings data