A ticket is the unit of work on the AlgaPSA service desk. Use this API to create tickets, move them through your boards and statuses, assign them to technicians, and log comments, time, and files.
A ticket references a board, a status, a priority, and a client — all by ID. Resolve those first: statuses and priorities have their own lookups (GET /tickets/statuses and GET /tickets/priorities), while board and client IDs come from their own APIs. The Create a ticket guide walks through the full lookup-then-create flow.
curl https://algapsa.com/api/v1/tickets \
-H "X-API-Key: $ALGA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "VPN down at the Northwind branch",
"client_id": "cl_3f9a2c",
"board_id": "bd_support",
"status_id": "st_new",
"priority_id": "pr_high"
}'Once a ticket exists, the rest happens through the sub-resources under /tickets/{id}: add notes with POST /comments, change where it sits with PUT /status, hand it off with PUT /assignment, and read logged effort from GET /time-entries. Files, documents, and materials hang off the same ticket.
List and filter with GET /tickets. Supported query parameters include status, client, board, priority, assignee, and more. To narrow results to tickets carrying specific tags, pass the tags parameter with a comma-separated list of tag names (e.g. ?tags=vip,urgent); tag values are matched case-insensitively. Run a text query with GET /tickets/search, or pull counts for a dashboard from GET /tickets/stats. To open a ticket straight from a piece of hardware, use POST /tickets/from-asset.
By default, GET /tickets omits tag information to keep responses lean. Add fields=tags to the query string to include each ticket's tag array in the response. Each tag entry contains tag_id, tag_text, background_color, and text_color. The parameter works alongside any other filter — for example, GET /api/v1/tickets?fields=tags&status_id=st_open returns all open tickets with their tags attached.
When several tickets describe the same underlying issue, group them under one master ticket. Create the bundle with POST /tickets/{id}/bundle, choosing a sync mode of link_only to just link the children or sync_updates to propagate the master's changes to them. Adjust membership later with POST /tickets/{id}/bundle/children and DELETE /tickets/{id}/bundle/children/{childId}, hand the master role to another ticket with POST /tickets/{id}/bundle/promote, and change the sync mode through PUT /tickets/{id}/bundle/settings. Read a ticket's role (master, child, or standalone) and its full membership from GET /tickets/{id}/bundle, or break the whole group apart with DELETE /tickets/{id}/bundle.
Service tickets can be linked to the hardware they affect. Use GET /tickets/{id}/assets to list all assets currently associated with a ticket; each row includes full asset details and the relationship type describing why it is linked. Create a link with POST /tickets/{id}/assets (supply asset_id; optionally pass relationship_type, default affected, and notes), and remove it with DELETE /tickets/{id}/assets/{assetId}. Reading linked assets requires ticket:read and asset:read; creating or removing a link also requires ticket:update. The same associations are readable and writable from the asset side — see Assets API.
DELETE /api/v1/tickets/{id} permanently removes a ticket and all its owned child records — comments, attachments, SLA notification history, email reply tokens, and project links are cleaned up automatically. If the ticket has records that cannot be removed automatically, such as logged time entries or schedule entries, the call returns 409 Conflict with a details.dependencies array that lists each blocking item so you know exactly what to remove or reassign first. Once the blocking records are cleared, retry the DELETE and it will succeed. A successful delete returns 204 No Content and the ticket is removed from the search index.
Every endpoint links through to its full parameters, request and response schemas, and code samples.
GET/api/v1/ticketsAlgaPSAAlgaDeskList ticketsPOST/api/v1/ticketsAlgaPSAAlgaDeskCreate ticketGET/api/v1/tickets/{id}AlgaPSAAlgaDeskGet ticketPUT/api/v1/tickets/{id}AlgaPSAAlgaDeskUpdate ticketDELETE/api/v1/tickets/{id}AlgaPSAAlgaDeskDelete ticketGET/api/v1/tickets/{id}/assetsAlgaPSAList assets linked to a ticketPOST/api/v1/tickets/{id}/assetsAlgaPSALink an asset to a ticketDELETE/api/v1/tickets/{id}/assets/{assetId}AlgaPSAUnlink an asset from a ticketPUT/api/v1/tickets/{id}/assignmentAlgaPSAAlgaDeskUpdate ticket assignmentGET/api/v1/tickets/{id}/bundleAlgaPSAAlgaDeskGet ticket bundlePOST/api/v1/tickets/{id}/bundleAlgaPSAAlgaDeskCreate ticket bundleDELETE/api/v1/tickets/{id}/bundleAlgaPSAAlgaDeskUnbundle ticketPOST/api/v1/tickets/{id}/bundle/childrenAlgaPSAAlgaDeskAdd bundle childrenDELETE/api/v1/tickets/{id}/bundle/children/{childId}AlgaPSAAlgaDeskRemove bundle childPOST/api/v1/tickets/{id}/bundle/promoteAlgaPSAAlgaDeskPromote bundle masterPUT/api/v1/tickets/{id}/bundle/settingsAlgaPSAAlgaDeskUpdate ticket bundle settingsGET/api/v1/tickets/{id}/commentsAlgaPSAAlgaDeskList ticket commentsPOST/api/v1/tickets/{id}/commentsAlgaPSAAlgaDeskAdd ticket commentPUT/api/v1/tickets/{id}/comments/{commentId}AlgaPSAAlgaDeskUpdate a ticket commentPOST/api/v1/tickets/{id}/comments/{commentId}/reactionsAlgaPSAAlgaDeskToggle a comment reactionGET/api/v1/tickets/{id}/documentsAlgaPSAAlgaDeskList ticket documentsPOST/api/v1/tickets/{id}/documentsAlgaPSAAlgaDeskUpload a ticket documentGET/api/v1/tickets/{id}/documents/{documentId}AlgaPSAAlgaDeskDownload a ticket documentDELETE/api/v1/tickets/{id}/documents/{documentId}AlgaPSAAlgaDeskDelete a ticket documentGET/api/v1/tickets/{id}/materialsAlgaPSAList ticket materialsPOST/api/v1/tickets/{id}/materialsAlgaPSAAdd a ticket materialPUT/api/v1/tickets/{id}/statusAlgaPSAAlgaDeskUpdate ticket statusGET/api/v1/tickets/{id}/time-entriesAlgaPSAList ticket time entriesGET/api/v1/tickets/from-assetAlgaPSACreate ticket from asset (POST only)POST/api/v1/tickets/from-assetAlgaPSACreate ticket from assetGET/api/v1/tickets/prioritiesAlgaPSAAlgaDeskList ticket prioritiesGET/api/v1/tickets/searchAlgaPSAAlgaDeskSearch ticketsGET/api/v1/tickets/statsAlgaPSAAlgaDeskGet ticket statsGET/api/v1/tickets/statusesAlgaPSAAlgaDeskList ticket statuses