Manage an agent's human-support tickets through the API: list and filter the tickets users raised with an agent, read a ticket's reply thread, respond as the support team, move tickets through their lifecycle, and close or delete them. Use when triaging or responding to support requests escalated from agent chats.
Auth & conventions
- Base URL:
https://api.iblai.app - Header:
Authorization: Api-Token $IBLAI_API_KEYon every request. - Path vars:
{org}=$IBLAI_ORG,{username}=$IBLAI_USERNAME,{mentor}= the agent's unique id (e.g.d17dc729-60fd-4363-81a0-f67d9318b03e). - Prefix: every route below hangs off
https://api.iblai.app/dm/api/ai-mentor/orgs/{org}/users/{username}(written{u}below). The path token is nameduser_idon the wire but takes the username. - Not connected yet? Run
/iblai-api-loginfirst to populateIBLAI_ORG,IBLAI_USERNAME, andIBLAI_API_KEY. - DELETE calls are destructive — confirm with the user first.
Concepts
- Tickets are opened by the agent, not by this API. When a user asks an agent
for human help mid-chat, the agent's human-support tool files a
HumanSupportTicket— there is no POST create endpoint here. The requester fields (username,email,full_name,user) and the sourcesessionare resolved server-side from that chat;subjectanddescriptionare authored by the agent (thedescriptionis often HTML or Markdown, not plain text). - Visibility: org admins see every ticket in the org; other users see only the tickets they raised themselves.
- Lifecycle:
statuswalksopen→in_progress→closed. The dedicatedclose/endpoint both setsstatus: closedand stampsresolved_at. - Conversation thread: each ticket has
TicketMessagereplies.senderis the numeric user id of the author — the requester's replies carry theiruserid, support-team replies carry the responder's id, andnullmarks a system-generated message. - Prerequisite: the agent only offers escalation while its human-support tool
is enabled — toggle it with
/iblai-api-agent-tool(pull the exact slug from that skill'savailable-tools/read).
Reads
Tickets
- GET
{u}/support-tickets/?mentor_id={mentor}&status={open|in_progress|closed}&username={requester}&session={session}&page={n}&page_size={n}— paged ticket list. Filters stack:mentor_idscopes to one agent,usernameto one requester,sessionto the chat session that raised the ticket. - GET
{u}/support-tickets/{id}/— one ticket.
Messages
- GET
{u}/support-ticket-messages/?ticket={ticketId}&sender={userId}&page={n}&page_size={n}— paged message list; passticketto load one ticket's conversation thread. - GET
{u}/support-ticket-messages/{id}/— one message.
Writes
Tickets
- PUT
{u}/support-tickets/{id}/— replace a ticket's editable fields:{ "subject": "string (required, ≤255 chars)", "description": "string (required)", "status": "open | in_progress | closed" } - PATCH
{u}/support-tickets/{id}/— edit a subset (e.g.{ "status": "in_progress" }). - POST
{u}/support-tickets/{id}/close/— close a ticket (no body): setsstatus: closedand stampsresolved_at. Prefer this over patchingstatustoclosed. - DELETE
{u}/support-tickets/{id}/— delete a ticket (no body). Destructive — confirm with the user first.
Messages
- POST
{u}/support-ticket-messages/— reply on a ticket:{ "ticket": "integer (required, ticket id)", "message": "string (required)", "sender": "integer | null (optional; defaults to the caller)" } - PUT
{u}/support-ticket-messages/{id}/— replace a message (same fields as create). - PATCH
{u}/support-ticket-messages/{id}/— edit a subset (e.g.{ "message": "string" }). - DELETE
{u}/support-ticket-messages/{id}/— delete a message (no body). Destructive — confirm with the user first.
Example
List one agent's open tickets, newest page first, then reply on ticket 42:
curl -s \
"https://api.iblai.app/dm/api/ai-mentor/orgs/$IBLAI_ORG/users/$IBLAI_USERNAME/support-tickets/?mentor_id=$MENTOR&status=open&page=1&page_size=10" \
-H "Authorization: Api-Token $IBLAI_API_KEY"
curl -X POST \
"https://api.iblai.app/dm/api/ai-mentor/orgs/$IBLAI_ORG/users/$IBLAI_USERNAME/support-ticket-messages/" \
-H "Authorization: Api-Token $IBLAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ticket": 42, "message": "We are looking into this now."}'
Notes
- List reads return a DRF page envelope —
{ "count": n, "next": url|null, "previous": url|null, "results": [...] }; iterateresults. DELETEs return204. - There is no ticket-create endpoint — tickets only come from agent chats (see Concepts). To test the flow end-to-end, enable the human-support tool and ask the agent to escalate.
mentor_idfilters by the agent's unique id, not its name;usernamefilters by the requester, independent of the{username}path token (the caller).descriptionis agent-authored and frequently arrives as a full HTML document or Markdown — don't assume plain text when displaying or diffing it.- Closing via
close/is what stampsresolved_at; a plainPATCHtostatus: closedflips the status without the resolution timestamp. - To load a conversation thread, filter messages by
ticketand sort bytimestampascending; matchsenderagainst the ticket'suserto tell requester replies from support replies.
Schema
Ticket object (HumanSupportTicket):
| field | mode | notes |
|---|---|---|
id |
ro | integer |
username, email, full_name, user |
ro | requester identity; user is the numeric user id |
session |
ro | chat session the ticket was raised from |
subject |
rw | ≤255 chars |
description |
rw | agent-authored body; often HTML/Markdown |
status |
rw | open | in_progress | closed |
mentor_id |
ro | unique id of the agent the ticket belongs to |
created_at, updated_at |
ro | ISO 8601 |
resolved_at |
ro | ISO 8601 or null; stamped by close/ |
Message object (TicketMessage): id (ro), ticket (ticket id), sender
(numeric user id or null for system messages), message, timestamp (ro, ISO 8601).