View .md

Tickets endpoints (Admin API)

32 FeatherPanel Admin API endpoints from admin/tickets.php: methods, paths, auth, permissions, rate limits, parameters and responses.

Last synced from FeatherPanel 15b94e9 on .

On this page

Defined in backend/app/routes/admin/tickets.php. Authentication used here: Admin. Read Authentication for how to send credentials and Rate limits and errors for the response envelope.

Paths, methods, permissions and rate limits come from the route file. Summaries, parameters and response codes come from the OpenAPI annotations on the controllers; endpoints without annotations show only what the route file declares.

Endpoints

GET/api/admin/tickets

Auth: AdminPermission: admin.tickets.viewRoute name: admin-ticketsController: TicketsController::indexroute source

Get all tickets Retrieve a paginated list of all tickets with optional filters and search functionality.

ParameterInTypeRequiredDescription
pagequeryintegernoPage number for pagination
limitqueryintegernoNumber of records per page
searchquerystringnoSearch term to filter tickets by title or description
user_uuidquerystring (uuid)noFilter by user UUID
server_idqueryintegernoFilter by server ID
category_idqueryintegernoFilter by category ID
status_idqueryintegernoFilter by status ID
Response data fieldTypeDescription
ticketsTicket[]
paginationTicketPagination
searchobject
curl -X GET "$PANEL_URL/api/admin/tickets" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Tickets retrieved successfully · 401 Unauthorized · 403 Forbidden - Insufficient permissions

PUT/api/admin/tickets

Auth: AdminPermission: admin.tickets.createRoute name: admin-tickets-createController: TicketsController::createroute source

Create new ticket Create a new ticket. Admins can create tickets on behalf of users.

Request body: TicketCreate (application/json)

Body fieldTypeRequiredDescription
user_uuidstring (uuid)yesUser UUID who is creating the ticket
server_idintegernoServer ID if ticket is related to a server
category_idintegeryesCategory ID
priority_idintegeryesPriority ID
status_idintegeryesStatus ID
titlestringyesTicket title
descriptionstringyesTicket description
Response data fieldTypeDescription
ticket_idintegerCreated ticket ID
ticket_uuidstring (uuid)Created ticket UUID
curl -X PUT "$PANEL_URL/api/admin/tickets" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"user_uuid":"","server_id":0,"category_id":0,"priority_id":0,"status_id":0,"title":"","description":""}'

Plugin events: featherpanel:ticket:created

Responses: 201 Ticket created successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 500 Internal server error

POST/api/admin/tickets/categories/upload-icon

Auth: AdminPermission: admin.ticket_categories.createRoute name: admin-ticket-categories-upload-iconController: TicketCategoriesController::uploadIconroute source

Upload icon for ticket category Upload an icon image file for ticket categories. Supports JPG, PNG, GIF, and WebP formats with a maximum size of 5MB.

Body fieldTypeRequiredDescription
iconstring (binary)yesIcon image file (JPG, PNG, GIF, WebP, max 5MB)
Response data fieldTypeDescription
urlstringPublic URL of the uploaded icon
filenamestringFilename of the uploaded icon
curl -X POST "$PANEL_URL/api/admin/tickets/categories/upload-icon" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -F "icon=@./file"

Responses: 201 Icon uploaded successfully · 400 Bad request - No file provided, invalid file type, or file too large · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 500 Internal server error - Failed to save file

GET/api/admin/tickets/categories

Auth: AdminPermission: admin.ticket_categories.viewRoute name: admin-ticket-categoriesController: TicketCategoriesController::indexroute source

Get all ticket categories Retrieve a paginated list of all ticket categories with optional search functionality.

ParameterInTypeRequiredDescription
pagequeryintegernoPage number for pagination
limitqueryintegernoNumber of records per page
searchquerystringnoSearch term to filter categories
Response data fieldTypeDescription
categoriesTicketCategory[]
paginationTicketCategoryPagination
searchobject
curl -X GET "$PANEL_URL/api/admin/tickets/categories" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Categories retrieved successfully · 401 Unauthorized · 403 Forbidden - Insufficient permissions

GET/api/admin/tickets/categories/{id}

Auth: AdminPermission: admin.ticket_categories.viewRoute name: admin-ticket-categories-showController: TicketCategoriesController::showroute source

Get ticket category by ID Retrieve a specific ticket category by its ID.

ParameterInTypeRequiredDescription
idpathintegeryesCategory ID
Response data fieldTypeDescription
categoryTicketCategory
curl -X GET "$PANEL_URL/api/admin/tickets/categories/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Category retrieved successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Category not found

PUT/api/admin/tickets/categories

Auth: AdminPermission: admin.ticket_categories.createRoute name: admin-ticket-categories-createController: TicketCategoriesController::createroute source

Create new ticket category Create a new ticket category with comprehensive validation.

Request body: TicketCategoryCreate (application/json)

Body fieldTypeRequiredDescription
namestringyesCategory name
iconstringnoCategory icon
colorstringnoCategory color
support_emailstringnoSupport email for this category
open_hoursstringnoOpen hours
descriptionstringnoCategory description
Response data fieldTypeDescription
category_idintegerCreated category ID
curl -X PUT "$PANEL_URL/api/admin/tickets/categories" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","icon":"","color":"","support_email":"","open_hours":"","description":""}'

Plugin events: featherpanel:ticket:category:created

Responses: 201 Category created successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 500 Internal server error

PATCH/api/admin/tickets/categories/{id}

Auth: AdminPermission: admin.ticket_categories.editRoute name: admin-ticket-categories-updateController: TicketCategoriesController::updateroute source

Update ticket category Update an existing ticket category with comprehensive validation.

ParameterInTypeRequiredDescription
idpathintegeryesCategory ID

Request body: TicketCategoryUpdate (application/json)

Body fieldTypeRequiredDescription
namestringnoCategory name
iconstringnoCategory icon
colorstringnoCategory color
support_emailstringnoSupport email for this category
open_hoursstringnoOpen hours
descriptionstringnoCategory description
Response data fieldTypeDescription
messagestringSuccess message
curl -X PATCH "$PANEL_URL/api/admin/tickets/categories/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","icon":"","color":"","support_email":"","open_hours":"","description":""}'

Plugin events: featherpanel:ticket:category:updated

Responses: 200 Category updated successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Category not found · 500 Internal server error

DELETE/api/admin/tickets/categories/{id}

Auth: AdminPermission: admin.ticket_categories.deleteRoute name: admin-ticket-categories-deleteController: TicketCategoriesController::deleteroute source

Delete ticket category Permanently delete a ticket category.

ParameterInTypeRequiredDescription
idpathintegeryesCategory ID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/categories/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:category:deleted

Responses: 200 Category deleted successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Category not found · 409 Conflict - Cannot delete (tickets exist) · 500 Internal server error

GET/api/admin/tickets/priorities

Auth: AdminPermission: admin.ticket_priorities.viewRoute name: admin-ticket-prioritiesController: TicketPrioritiesController::indexroute source

Get all ticket priorities Retrieve a paginated list of all ticket priorities with optional search functionality.

ParameterInTypeRequiredDescription
pagequeryintegernoPage number for pagination
limitqueryintegernoNumber of records per page
searchquerystringnoSearch term to filter priorities
Response data fieldTypeDescription
prioritiesTicketPriority[]
paginationTicketPriorityPagination
searchobject
curl -X GET "$PANEL_URL/api/admin/tickets/priorities" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Priorities retrieved successfully · 401 Unauthorized · 403 Forbidden - Insufficient permissions

GET/api/admin/tickets/priorities/{id}

Auth: AdminPermission: admin.ticket_priorities.viewRoute name: admin-ticket-priorities-showController: TicketPrioritiesController::showroute source

Get ticket priority by ID Retrieve a specific ticket priority by its ID.

ParameterInTypeRequiredDescription
idpathintegeryesPriority ID
Response data fieldTypeDescription
priorityTicketPriority
curl -X GET "$PANEL_URL/api/admin/tickets/priorities/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Priority retrieved successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Priority not found

PUT/api/admin/tickets/priorities

Auth: AdminPermission: admin.ticket_priorities.createRoute name: admin-ticket-priorities-createController: TicketPrioritiesController::createroute source

Create new ticket priority Create a new ticket priority.

Request body: TicketPriorityCreate (application/json)

Body fieldTypeRequiredDescription
namestringyesPriority name
colorstringnoPriority color
sort_orderintegernoDisplay order (lower appears first)
Response data fieldTypeDescription
priority_idintegerCreated priority ID
curl -X PUT "$PANEL_URL/api/admin/tickets/priorities" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","color":"","sort_order":0}'

Plugin events: featherpanel:ticket:priority:created

Responses: 201 Priority created successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 500 Internal server error

PATCH/api/admin/tickets/priorities/{id}

Auth: AdminPermission: admin.ticket_priorities.editRoute name: admin-ticket-priorities-updateController: TicketPrioritiesController::updateroute source

Update ticket priority Update an existing ticket priority.

ParameterInTypeRequiredDescription
idpathintegeryesPriority ID

Request body: TicketPriorityUpdate (application/json)

Body fieldTypeRequiredDescription
namestringnoPriority name
colorstringnoPriority color
sort_orderintegernoDisplay order (lower appears first)
Response data fieldTypeDescription
messagestringSuccess message
curl -X PATCH "$PANEL_URL/api/admin/tickets/priorities/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","color":"","sort_order":0}'

Plugin events: featherpanel:ticket:priority:updated

Responses: 200 Priority updated successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Priority not found · 500 Internal server error

DELETE/api/admin/tickets/priorities/{id}

Auth: AdminPermission: admin.ticket_priorities.deleteRoute name: admin-ticket-priorities-deleteController: TicketPrioritiesController::deleteroute source

Delete ticket priority Permanently delete a ticket priority.

ParameterInTypeRequiredDescription
idpathintegeryesPriority ID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/priorities/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:priority:deleted

Responses: 200 Priority deleted successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Priority not found · 500 Internal server error

GET/api/admin/tickets/statuses

Auth: AdminPermission: admin.ticket_statuses.viewRoute name: admin-ticket-statusesController: TicketStatusesController::indexroute source

Get all ticket statuses Retrieve a paginated list of all ticket statuses with optional search functionality.

ParameterInTypeRequiredDescription
pagequeryintegernoPage number for pagination
limitqueryintegernoNumber of records per page
searchquerystringnoSearch term to filter statuses
Response data fieldTypeDescription
statusesTicketStatus[]
paginationTicketStatusPagination
searchobject
curl -X GET "$PANEL_URL/api/admin/tickets/statuses" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Statuses retrieved successfully · 401 Unauthorized · 403 Forbidden - Insufficient permissions

GET/api/admin/tickets/statuses/{id}

Auth: AdminPermission: admin.ticket_statuses.viewRoute name: admin-ticket-statuses-showController: TicketStatusesController::showroute source

Get ticket status by ID Retrieve a specific ticket status by its ID.

ParameterInTypeRequiredDescription
idpathintegeryesStatus ID
Response data fieldTypeDescription
statusTicketStatus
curl -X GET "$PANEL_URL/api/admin/tickets/statuses/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Status retrieved successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Status not found

PUT/api/admin/tickets/statuses

Auth: AdminPermission: admin.ticket_statuses.createRoute name: admin-ticket-statuses-createController: TicketStatusesController::createroute source

Create new ticket status Create a new ticket status.

Request body: TicketStatusCreate (application/json)

Body fieldTypeRequiredDescription
namestringyesStatus name
colorstringnoStatus color
sort_orderintegernoDisplay order (lower appears first)
is_defaultbooleannoAssign this status to newly created tickets
Response data fieldTypeDescription
status_idintegerCreated status ID
curl -X PUT "$PANEL_URL/api/admin/tickets/statuses" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","color":"","sort_order":0,"is_default":false}'

Plugin events: featherpanel:ticket:status:created

Responses: 201 Status created successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 500 Internal server error

PATCH/api/admin/tickets/statuses/{id}

Auth: AdminPermission: admin.ticket_statuses.editRoute name: admin-ticket-statuses-updateController: TicketStatusesController::updateroute source

Update ticket status Update an existing ticket status.

ParameterInTypeRequiredDescription
idpathintegeryesStatus ID

Request body: TicketStatusUpdate (application/json)

Body fieldTypeRequiredDescription
namestringnoStatus name
colorstringnoStatus color
sort_orderintegernoDisplay order (lower appears first)
is_defaultbooleannoAssign this status to newly created tickets
Response data fieldTypeDescription
messagestringSuccess message
curl -X PATCH "$PANEL_URL/api/admin/tickets/statuses/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"","color":"","sort_order":0,"is_default":false}'

Plugin events: featherpanel:ticket:status:updated

Responses: 200 Status updated successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Status not found · 500 Internal server error

DELETE/api/admin/tickets/statuses/{id}

Auth: AdminPermission: admin.ticket_statuses.deleteRoute name: admin-ticket-statuses-deleteController: TicketStatusesController::deleteroute source

Delete ticket status Permanently delete a ticket status.

ParameterInTypeRequiredDescription
idpathintegeryesStatus ID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/statuses/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:status:deleted

Responses: 200 Status deleted successfully · 400 Bad request - Invalid ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Status not found · 500 Internal server error

GET/api/admin/tickets/{uuid}/messages

Auth: AdminPermission: admin.ticket_messages.viewRoute name: admin-ticket-messagesController: TicketMessagesController::indexroute source

Get all messages for a ticket Retrieve all messages for a specific ticket by UUID.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
Response data fieldTypeDescription
messagesTicketMessage[]
curl -X GET "$PANEL_URL/api/admin/tickets/$UUID/messages" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Messages retrieved successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found

GET/api/admin/tickets/{uuid}/messages/{id}

Auth: AdminPermission: admin.ticket_messages.viewRoute name: admin-ticket-messages-showController: TicketMessagesController::showroute source

Get ticket message by ID Retrieve a specific message from a ticket.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
idpathintegeryesMessage ID
Response data fieldTypeDescription
messageTicketMessage
curl -X GET "$PANEL_URL/api/admin/tickets/$UUID/messages/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Message retrieved successfully · 400 Bad request - Invalid UUID or ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket or message not found

POST/api/admin/tickets/{uuid}/messages

Auth: AdminPermission: admin.ticket_messages.manageRoute name: admin-ticket-messages-createController: TicketMessagesController::createroute source

Create new message for ticket Add a new message/reply to a ticket. Support staff can add internal notes.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID

Request body: TicketMessageCreate (application/json)

Body fieldTypeRequiredDescription
messagestringyesMessage content
is_internalbooleannoWhether this is an internal note (staff only)
Response data fieldTypeDescription
message_idintegerCreated message ID
curl -X POST "$PANEL_URL/api/admin/tickets/$UUID/messages" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"message":"","is_internal":false}'

Plugin events: featherpanel:ticket:message:created

Responses: 201 Message created successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found · 500 Internal server error

PATCH/api/admin/tickets/{uuid}/messages/{id}

Auth: AdminPermission: admin.ticket_messages.manageRoute name: admin-ticket-messages-updateController: TicketMessagesController::updateroute source

Update ticket message Update an existing message in a ticket.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
idpathintegeryesMessage ID

Request body: TicketMessageUpdate (application/json)

Body fieldTypeRequiredDescription
messagestringnoMessage content
is_internalbooleannoWhether this is an internal note (staff only)
Response data fieldTypeDescription
messagestringSuccess message
curl -X PATCH "$PANEL_URL/api/admin/tickets/$UUID/messages/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"message":"","is_internal":false}'

Plugin events: featherpanel:ticket:message:updated

Responses: 200 Message updated successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket or message not found · 500 Internal server error

DELETE/api/admin/tickets/{uuid}/messages/{id}

Auth: AdminPermission: admin.ticket_messages.manageRoute name: admin-ticket-messages-deleteController: TicketMessagesController::deleteroute source

Delete ticket message Permanently delete a message from a ticket.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
idpathintegeryesMessage ID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/$UUID/messages/$ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:message:deleted

Responses: 200 Message deleted successfully · 400 Bad request - Invalid UUID or ID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket or message not found · 500 Internal server error

POST/api/admin/tickets/{uuid}/attachments

Auth: AdminPermission: admin.ticket_attachments.manageRoute name: admin-ticket-attachments-uploadController: TicketAttachmentsController::uploadroute source

Upload attachment for ticket Upload an attachment file for a ticket. Supports various file types with a maximum size of 50MB. Files are stored under /attachments using the pattern <ticketUuid>_tk_<name>.<extension>.

ParameterInTypeRequiredDescription
uuidpathstringyesTicket UUID
Body fieldTypeRequiredDescription
filestring (binary)yesAttachment file (max 50MB)
Response data fieldTypeDescription
attachment_idintegerAttachment ID
urlstringPublic URL of the attachment
filenamestringStored filename
curl -X POST "$PANEL_URL/api/admin/tickets/$UUID/attachments" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -F "file=@./file"

Plugin events: featherpanel:ticket:attachment:created

Responses: 201 Attachment uploaded successfully · 400 Bad request - No file provided or invalid file · 401 Unauthorized · 403 Forbidden - Attachments disabled · 404 Ticket not found · 500 Internal server error - Failed to save file

GET/api/admin/tickets/{uuid}/attachments

Auth: AdminPermission: admin.ticket_attachments.viewRoute name: admin-ticket-attachments-indexController: TicketAttachmentsController::indexroute source

Get attachments for ticket Retrieve all attachments associated with a ticket.

ParameterInTypeRequiredDescription
uuidpathstringyesTicket UUID
Response data fieldTypeDescription
attachmentsTicketAttachment[]
curl -X GET "$PANEL_URL/api/admin/tickets/$UUID/attachments" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Attachments retrieved successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden · 404 Ticket not found

DELETE/api/admin/tickets/{uuid}/attachments/{attachmentId}

Auth: AdminPermission: admin.ticket_attachments.manageRoute name: admin-ticket-attachments-deleteController: TicketAttachmentsController::deleteroute source

Delete ticket attachment Delete a specific attachment associated with a ticket.

ParameterInTypeRequiredDescription
uuidpathstringyesTicket UUID
attachmentIdpathintegeryesAttachment ID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/$UUID/attachments/$ATTACHMENT_ID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:attachment:deleted

Responses: 200 Attachment deleted successfully · 400 Bad request - Invalid parameters · 401 Unauthorized · 403 Forbidden · 404 Ticket or attachment not found · 500 Internal server error

POST/api/admin/tickets/{uuid}/reply

Auth: AdminPermission: admin.tickets.editRoute name: admin-tickets-replyController: TicketsController::replyroute source

Reply to ticket Add a reply/message to a ticket. Support staff can add internal notes.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID

Request body: TicketReply (application/json)

Body fieldTypeRequiredDescription
messagestringyesReply message
is_internalbooleannoWhether this is an internal note (staff only)
Response data fieldTypeDescription
message_idintegerCreated message ID
curl -X POST "$PANEL_URL/api/admin/tickets/$UUID/reply" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"message":"","is_internal":false}'

Plugin events: featherpanel:ticket:message:created

Responses: 201 Reply added successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found · 500 Internal server error

POST/api/admin/tickets/{uuid}/close

Auth: AdminPermission: admin.tickets.editRoute name: admin-tickets-closeController: TicketsController::closeroute source

Close ticket Mark a ticket as closed by setting its status to the "closed" status and updating closed_at.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
curl -X POST "$PANEL_URL/api/admin/tickets/$UUID/close" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:closed, featherpanel:ticket:status:changed

Responses: 200 Ticket closed successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket or status not found · 500 Internal server error

POST/api/admin/tickets/{uuid}/reopen

Auth: AdminPermission: admin.tickets.editRoute name: admin-tickets-reopenController: TicketsController::reopenroute source

Reopen ticket Reopen a previously closed ticket by setting its status to the "open" status and clearing closed_at.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
curl -X POST "$PANEL_URL/api/admin/tickets/$UUID/reopen" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:reopened, featherpanel:ticket:status:changed

Responses: 200 Ticket reopened successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket or status not found · 500 Internal server error

GET/api/admin/tickets/{uuid}

Auth: AdminPermission: admin.tickets.viewRoute name: admin-tickets-showController: TicketsController::showroute source

Get ticket by UUID Retrieve a specific ticket by its UUID with all messages and attachments.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
Response data fieldTypeDescription
ticketTicket
messagesobject[]Ticket messages
attachmentsobject[]Ticket attachments
curl -X GET "$PANEL_URL/api/admin/tickets/$UUID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Responses: 200 Ticket retrieved successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found

PATCH/api/admin/tickets/{uuid}

Auth: AdminPermission: admin.tickets.editRoute name: admin-tickets-updateController: TicketsController::updateroute source

Update ticket Update an existing ticket (status, priority, category, etc.).

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID

Request body: TicketUpdate (application/json)

Body fieldTypeRequiredDescription
server_idintegernoServer ID if ticket is related to a server
category_idintegernoCategory ID
priority_idintegernoPriority ID
status_idintegernoStatus ID
titlestringnoTicket title
descriptionstringnoTicket description
closed_atstring (date-time)noTicket closed timestamp
Response data fieldTypeDescription
messagestringSuccess message
curl -X PATCH "$PANEL_URL/api/admin/tickets/$UUID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"server_id":0,"category_id":0,"priority_id":0,"status_id":0,"title":"","description":"","closed_at":""}'

Plugin events: featherpanel:ticket:closed, featherpanel:ticket:reopened, featherpanel:ticket:status:changed, featherpanel:ticket:updated

Responses: 200 Ticket updated successfully · 400 Bad request - Validation errors · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found · 500 Internal server error

DELETE/api/admin/tickets/{uuid}

Auth: AdminPermission: admin.tickets.deleteRoute name: admin-tickets-deleteController: TicketsController::deleteroute source

Delete ticket Permanently delete a ticket. This will also delete all messages and attachments.

ParameterInTypeRequiredDescription
uuidpathstring (uuid)yesTicket UUID
Response data fieldTypeDescription
messagestringSuccess message
curl -X DELETE "$PANEL_URL/api/admin/tickets/$UUID" \
  -H "Authorization: Bearer $FEATHERPANEL_API_KEY" \
  -H "Accept: application/json"

Plugin events: featherpanel:ticket:deleted

Responses: 200 Ticket deleted successfully · 400 Bad request - Invalid UUID · 401 Unauthorized · 403 Forbidden - Insufficient permissions · 404 Ticket not found · 500 Internal server error