halopsa-tickets — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited halopsa-tickets (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Tickets are the core unit of service delivery in HaloPSA. The API uses array-wrapped payloads for all write operations (POST /api/Tickets with [{...}]). Status, priority, and ticket type IDs are instance-configurable -- always query /api/Status, /api/Priority, and /api/TicketType to get valid values.
POST /api/Tickets
Authorization: Bearer {token}
Content-Type: application/json[
{
"summary": "Unable to access email - multiple users affected",
"details": "<p>Sales team (5 users) reporting Outlook disconnected since 9am.</p>",
"client_id": 123,
"site_id": 456,
"user_id": 789,
"tickettype_id": 1,
"status_id": 1,
"priority_id": 2,
"category_1": "Email",
"agent_id": 101,
"team_id": 5
}
]GET /api/Tickets/54321 # single ticket
GET /api/Tickets/54321?includedetails=true&includeactions=true # with related data
GET /api/Tickets?client_id=123&open_only=true # open tickets for client
GET /api/Tickets?search=email%20not%20working # text search
GET /api/Tickets?page_no=1&page_size=50&orderdesc=true # paginatedPOST /api/Tickets[{ "id": 54321, "status_id": 2, "agent_id": 101 }]Resolve with resolution note:
[{ "id": 54321, "status_id": 8, "resolution": "Cleared Outlook cache and repaired Office installation." }]POST /api/ActionsInternal note:
[{ "ticket_id": 54321, "note": "<p>Root cause: KB5034441 update.</p>", "actiontype_id": 0, "hiddenfromuser": true }]Client-visible note with email:
[{ "ticket_id": 54321, "note": "<p>We've identified the cause and are working on a fix.</p>", "actiontype_id": 0, "hiddenfromuser": false, "emailto": "[email protected]" }]Time entry:
[{ "ticket_id": 54321, "note": "<p>Troubleshooting email connectivity.</p>", "timetaken": 30, "charge": true, "actiontype_id": 0, "agent_id": 101 }]POST /api/Attachment # multipart/form-data: file, ticket_id, filename, isimage
GET /api/Attachment?ticket_id=54321 # list attachmentsGET /api/Clients/{client_id}. If not found: stop and report error.GET /api/ClientContract?client_id={id}&active_only=true. If no active contract: stop and notify, or proceed per org policy.GET /api/Tickets?client_id={id}&open_only=true&search={summary_keywords}. If duplicate found: link tickets via action note instead of creating new ticket.POST /api/Tickets with defaults: status_id=1, priority_id=3 (if unspecified).id. If 400 error: check required fields (client_id, summary, tickettype_id).Before changing status, verify:
resolution field is required. Warn if moving directly from New without In Progress step.agent_id should be assigned. Warn if missing./api/Status to confirm target status is valid for your instance.timetaken and charge to action notesslahold=false approaching deadlinedate need escalation~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.