Skip to content

Support tickets API ​

All endpoints under /api/support/tickets require a bearer token. Reading needs support:read, creating needs support:create, replying or closing needs support:update.

Prefer email? Writing to support@microapps.io opens a ticket too.

Mind the trailing slash

The collection routes are /api/support/tickets/, with the slash. Drop it and you get a redirect rather than a response, which most HTTP clients will not follow on a POST.

List your tickets ​

http
GET /api/support/tickets/?page=1&limit=20&search=pod

Paginated, newest first. Returns the standard { data, total, page, limit, totalPages } envelope. search matches the subject only, case-insensitively - it does not look inside the messages.

json
{
  "data": [
    {
      "id": "6a4d5b83b7006ccae6391870",
      "accountId": "6a4d5b83b7006ccae6391800",
      "userId": "6a4d5b83b7006ccae6391801",
      "subject": "Cannot start my pod",
      "category": "technical",
      "status": "waiting",
      "messages": [
        {
          "role": "user",
          "message": "I clicked start on my-app and it flips straight back to stopped.",
          "userId": "6a4d5b83b7006ccae6391801",
          "createdAt": "2026-07-16T14:02:11Z"
        },
        {
          "role": "agent",
          "message": "Thanks - what does the service log say when it exits?",
          "agentId": "6a4d5b83b7006ccae63918a0",
          "createdAt": "2026-07-16T15:10:00Z"
        }
      ],
      "createdAt": "2026-07-16T14:02:11Z",
      "updatedAt": "2026-07-16T15:10:00Z"
    }
  ],
  "total": 3,
  "page": 1,
  "limit": 20,
  "totalPages": 1
}

Every ticket carries its whole messages thread, so the list response is not a lightweight summary. Ask for a small limit if you have a lot of long threads.

Get a ticket ​

http
GET /api/support/tickets/:id

Returns one ticket in the shape above. A ticket belonging to another account returns 404.

Create a ticket ​

http
POST /api/support/tickets/
json
{
  "subject": "Cannot start my pod",
  "category": "technical",
  "message": "I clicked start on my-app and it flips straight back to stopped."
}

Returns 201 with the new ticket, status set to open and your message as the first entry in messages.

category is one of:

CategoryUse it for
generalAnything that does not fit below
billingCredit, invoices, payments
technicalSomething is broken or behaving oddly
accountLogin, profile, team, access
feature"It would be great if..."
ProblemStatusMessage
subject shorter than 3 or longer than 200 characters400Subject must be between 3 and 200 characters
message shorter than 10 or longer than 5000 characters400Message must be between 10 and 5000 characters
category is not one of the five400Invalid category

Leading and trailing whitespace is trimmed before the lengths are checked, and category is lowercased for you.

Reply to a ticket ​

http
POST /api/support/tickets/:id/replies
json
{ "message": "Here it is: `Failed to bind to 0.0.0.0:8080, address already in use`. Something else is holding the port." }

Returns 200 with the updated ticket, your reply appended. A reply is 1 to 5000 characters.

Replying to a ticket that is waiting on you flips it back to open. Closed or resolved tickets reject replies with 400 ("Cannot reply to a closed or resolved ticket").

Close a ticket ​

http
PATCH /api/support/tickets/:id/close

No body. Marks the ticket closed and returns 200 with the updated ticket. Closing one that is already closed returns 400.

Closed and resolved tickets don't take replies - open a new ticket if there's more to say.

Ticket status ​

A ticket moves through these as we work it, and you will see the current one on the ticket:

StatusMeaning
openWe have it, not started yet
inProgressSomeone is on it
waitingWe are waiting on you, usually for a reply
resolvedWe think it is sorted
closedDone, or you closed it

You can set closed (by closing the ticket) and open (by replying to one that was waiting). The rest are ours to set. Every change emails the address on your account.

curl example ​

bash
curl -X POST https://cloud-api.microapps.io/api/support/tickets/ \
  -H "Authorization: Bearer $MICROAPPS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Cannot start my pod",
    "category": "technical",
    "message": "I clicked start on my-app and it flips straight back to stopped."
  }'

Then follow the thread:

bash
curl -s https://cloud-api.microapps.io/api/support/tickets/6a4d5b83b7006ccae6391870 \
  -H "Authorization: Bearer $MICROAPPS_API_KEY" \
  | jq '.messages[] | {role, createdAt, message}'

Built for the long tail.