NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages

All extend TicketsException (a RuntimeException); messages come from tickets::messages in English and Slovak. The HTTP column is what the API answers:

ExceptionThrown whenHTTP
TicketNotFoundExceptionAn unknown or soft-deleted reference / key.404
TicketRecordNotFoundExceptionAn unknown link, category, field or tag id — errorCode(): link_not_found, category_not_found, field_not_found, tag_not_found.404
TicketCommentNotFoundExceptionA comment not of this ticket.404
TicketAttachmentNotFoundExceptionMedia not of this ticket.404
TicketAccessDeniedExceptionSomeone who is no participant writes; anyone but an agent for the ticket posts a note.403
GuestAccessDeniedExceptionAn invalid guest link; a link for a non-recipient.403
TicketClosedExceptionA message, edit or delete on a Closed ticket.409
TicketTrashedExceptionA mutation of a soft-deleted ticket.409
FieldTypeLockedExceptionChanging type or encryption, or dropping options, of a field in use.409
DuplicateTicketReferenceExceptionTwo projects with the same prefix.409
FieldNotEditableExceptionAn unknown key, or a field the requester may not edit — errorCode(): unknown_field / field_not_editable.422
UnknownTicketFieldExceptionwhereField* on an unknown, encrypted or unfilterable key.422
UnknownTicketTransitionExceptionA named convenience the configured lifecycle lacks.422
UnknownMorphAliasExceptionAn alias not on the allow-list, a class name, or a key no record has — errorCode(): unknown_requester_type, unknown_assignee_type, unknown_watcher_type, unknown_project_type.422
InvalidAssigneeExceptionNot an Assignee, no actor to claim for, ineligible.422
InvalidCategoryExceptionCycle, too deep, project mismatch, inactive, in use (deleting without reassignTo), has children, an unknown id, a bad name / priority / due offset; a reassignTo that is the category itself, inactive or of another project.422
InvalidFieldExceptionBad or duplicate key, options missing or unexpected, rule not allowed, empty label.422
InvalidTagExceptionBad name or colour, duplicate, unknown (free-form off), project mismatch.422
InvalidTicketLinkExceptionSelf link, cycle, second parent, cross-project, too deep, not linked.422
InvalidMergeExceptionSame ticket, source or target closed or merged, cross-project, not allowed.422
InvalidWatcherExceptionwatch() without an actor.422
InvalidProjectExceptionNot a TicketProject, an invalid prefix.422
InvalidTicketLifecycleExceptionThe configured lifecycle breaks the ticket contract.config (500)
InvalidTicketsConfigurationExceptionA junk config value (the message names the key and what it expects).config (500)
ActivityIsAppendOnlyExceptionUpdating or deleting an activity entry.—

Lifecycle’s own TransitionDeniedException (422 / 429), AmbiguousTransitionException and SubjectTrashedException surface for transitions. Field values that fail their rules throw Laravel’s ValidationException, keyed fields.<key> and worded with the field’s label; guest fields are keyed fields.<name> from Tickets::guests() and guest.<name> when filing a ticket or changing its requester.

Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

More ways to support, including crypto

By donating, you agree to our donation terms.

Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.