Skip to content
Coritan Docs

Answer customer conversations

Work the live support inbox, answer customers from the three pane ticket page, pass tickets between tiers and read the team's support figures.

View as Markdown

/staff/inbox in the staff console holds every support conversation between your organization and its customers. A conversation is one thread with one customer, with a number of its own in your organization such as #1042; the console calls it a ticket. Use the inbox to take tickets from the queue, answer them, pass them to a teammate or a higher tier, and ask the customer for their server's logs or for access to the server. The inbox follows the platform as it changes, so a new ticket reaches you without a refresh.

The read-only role cannot open the inbox. Each role can do everything the roles below it can, and billing, admin and owner can do everything Tier 3 can.

Task Lowest role
Take tickets from the queue, reply, add internal notes, close and reopen Tier 1 support
Ask a customer for their server's logs Tier 1 support
Read the canned replies, and insert them Tier 1 support
Read every ticket, and take ones escalated to Tier 2 Tier 2 support
Ask a customer for access to their server Tier 2 support
Act on any ticket, give one to a teammate, or move one to another customer Tier 3 support
Open a ticket for a customer, escalate one to Coritan, or change many at once Tier 3 support
Write, change and delete canned replies Tier 3 support
Read the support analytics Tier 3 support

How far each tier reaches:

  • Tier 1 sees the queue and the tickets it holds. Any other ticket answers 404 Conversation not found.
  • Tier 2 reads every ticket. It acts on its own tickets and on unclaimed ones that are not escalated above Tier 2, and it can leave an internal note on a teammate's ticket.
  • Tier 3 acts on every ticket.

A Tier 1 member may hold 10 open tickets at once. An admin can set another number from 1 to 100, as Manage the staff team and console settings explains. The other roles have no limit.

A control your role cannot use stays on the page, dimmed, and names the role it needs, such as Needs Tier 3 support or higher. On a ticket you cannot act on, the Reply choice is dimmed and says who holds the ticket, and you can still add an internal note.

Know where conversations come from

Section titled Know where conversations come from

Conversations reach the inbox from:

  • customers, from your storefront's support page or through the API with their customer token;
  • email to your brand's support mailbox, when we run one for you;
  • the /support command in your Discord server, when you connect Discord;
  • a free customer's request for an extra port, tagged port-request, as Add a port for a port request explains;
  • a customer's request for a higher mail relay limit, tagged mail and limit-increase, as Pass on a request for a higher limit explains;
  • your storefront's contact form, when a signed-in customer sends it, in the sales department and tagged storefront-inquiry;
  • your team's actions on many servers, and our abuse review's locks, in the abuse department;
  • your team, when it opens a conversation for a customer.

Email reaches the inbox in one of two ways, and your organization uses one.

  • Your own mailbox. You keep your mail where it is, such as a Google Workspace mailbox, and an admin connects a separate mailbox in Settings, Support mailbox. We email your customers about a ticket with a reply address that points at that mailbox, and we read the mailbox every minute. Read customer replies in your own mailbox has the steps and the rules.
  • A mailbox we run for you. Coritan can run a support mailbox for your brand, such as support@ your domain; contact support to have one. You cannot have both.

With either one, a customer's reply to an email about a ticket goes onto that ticket, and it reopens the ticket if it was closed. A new email from a customer opens a ticket. We open one only when the address belongs to one of your customers, the sender check passed, and the customer may open a conversation. Otherwise a mailbox we run replies at most once a day to say how to reach you, and we never reply to unverified mail from someone with no account. We ignore other mail that reaches your own mailbox, and we never move or delete it. Mail to abuse@ and postmaster@ on a mailbox we run always opens a conversation. We cut a body at 10,000 characters, and leave out attachments over 25 MB and any after the 20th, with a line in the message that names what we left out.

A reply you send from a ticket goes to the customer by email, and replies to it come back by whichever way your organization uses. With no mailbox set up, the email tells the customer to reply in your storefront.

The inbox is a live list. A dot beside its title reads Live while the page is connected to the platform and Reconnecting while it is not, with when it last heard (Heard 3m ago). The header also says when the list last arrived, and its refresh button reloads it.

  1. Open /staff/inbox. It opens on the Queue view: tickets nobody holds that wait for your team at your tier or below, paying customers first, then the highest priority, then the oldest. A ticket from a customer with Priority Support opens at High, so it comes ahead of the other tickets of paying customers that are not higher.
  2. Choose Take next, which shows how many are waiting, or press t. We give you the ticket at the front of the queue and open it, and two members who take at the same moment get different tickets. It becomes yours and in_progress. The button is dimmed when the queue is empty or you hold as many tickets as your tier may, and in the second case its tooltip says so.
  3. To answer a particular one instead, open it from the list, or choose Take in its Assigned column.

When a new ticket arrives, a toast reads New ticket: #1042 with its subject, and a callout above the tiles has an Open button.

The strip above the list switches between seven views, each with its count: Queue, Mine, All open, Waiting on the customer, On hold, Escalated and Closed. Tier 1 has no Escalated view. Six figures sit above it, and each is a view seen from above:

Figure What it counts
Waiting Unassigned tickets with no reply yet, and how long the oldest has waited.
Yours Open tickets on your name, and for Tier 1 how many your limit allows.
Open Tickets still being worked, and how many more are on hold. Tier 2 and up.
Past SLA Tickets past a reply or resolution target. It opens the All open view with Past target only on.
First reply The time from opening to the first reply, over tickets whose first reply came in the last 30 days. Tier 2 and up. It opens the support analytics for Tier 3 and up.
Closed today Tickets your team closed since midnight in your brand's time zone. Tier 2 and up.

A figure that is at zero and needs no one rests quietly. The figures your whole team shares are normally no more than 8 seconds old, and up to 2 minutes old on the first screen after a quiet spell. Yours is always current.

Search by subject, message text, the customer's email or a number such as #1042. Narrow by Status, Priority and Department, and use the Views menu to keep the current filters under a name. Its built in views are Past target, Critical and open, and High priority in the queue. Tier 3 can also list the tickets one teammate holds, from Who holds what or the support analytics. Every filter shows as a chip, and it is all in the address, so you can send a view to a colleague.

A conversation moves through these statuses:

Status What it means
open New or reopened.
awaiting_agent The customer wrote last.
in_progress A member took it and has not replied yet.
awaiting_customer Your team wrote last.
on_hold A member set it aside, out of the queue.
closed Settled. The customer can reopen it.

Every conversation can carry a department. The departments are the same for every organization on Coritan, and each sets a target time for the first reply and one for the resolution. An organization that sets a standard first reply target, or sells Priority Support, replaces the department's first reply target on the new tickets a customer opens with its own (a ticket your team opens for a customer keeps the department's), and the resolution target is never shorter than the first reply target. A conversation counts as past its target while the next move is your team's (open, awaiting_agent or in_progress) and it has missed the first reply, before your team sends one, or the resolution. A conversation waiting on the customer or on hold is not counted. A conversation that opens with a notice to the customer, such as the one a suspension or an abuse lock opens, has no first-reply target until the customer answers it; the target then runs from that answer. On each row, sla_breached_first_response and sla_breached_resolution stay true once a target is missed, even after your team replies.

A row shows the subject, the last message, and under it #1042 · department · customer. Marks beside the subject say when the ticket has unread messages, is escalated (Tier 2), carries a draft of yours, or is open on a teammate's screen. The other columns are Status, SLA (Breached, or when the next target falls due), Waiting, and Assigned. The Columns menu adds Escalated, Rating and Opened. Select a row for a quick view, or its subject, or o, for the ticket. j, k, Enter and x work as on every list.

From Tier 3, tick tickets to take them, drop them back into the queue, close them, or set their priority or department, for up to 100 at once. We skip any ticket outside your organization.

The More menu in the header holds New ticket (Tier 3, key c), Canned replies and Keyboard shortcuts. Analytics, beside it, is for Tier 3 and up.

A ticket opens as a workspace. On a page wide enough, three panes sit side by side: the list you came from, the conversation with its composer, and a column about the ticket and its customer. Narrower, the list pane goes, Back to inbox keeps the filters, and the column moves under the conversation.

  • The list pane shows the view the ticket came from, because the inbox links carry its filters. j and k step to the next and the previous ticket of that list, and the breadcrumb says where you are, such as 3 of 40.
  • The header holds the subject, the status, the priority and any escalation. Its main button is Take it when the ticket is free for you, Close ticket when it is yours, and Reopen ticket when it is closed. The ⋯ menu holds the rest, below.
  • One callout at the top flags what needs a person: a first reply past its target, a teammate who has the ticket open too (check before you both answer), or a ticket you cannot act on.
  • The conversation shows each message, internal notes marked with a lock and Internal note, files you can download, and Seen under the last staff message the customer has read. When the customer is writing, a line under it reads Name is typing….
  • The column on the right has cards for the ticket (Status, Priority, Department, Assigned to and its tags), the customer, their servers, the ticket's timing against its targets, their other tickets, and the notes on the customer.

Keys on a ticket: r replies, n writes a note, t takes it, e closes it, and Esc leaves the box.

The composer under the conversation is a switch between Reply, which goes to the customer by email and on your storefront's support page, and Note, which only staff see. Each keeps its own draft for the ticket, and a draft survives a reload and a visit to another page; Draft restored says so. Choose Send reply, or Add note, or press Ctrl Enter (Cmd Enter on a Mac).

  1. Type / to open the canned replies as a list, the ticket's department first. Keep typing to narrow it. Move with the arrow keys, and press Enter or Tab to insert one, or Esc to put the list away. The Canned replies menu in the composer lists them too.
  2. Placeholders are filled in when you insert a reply: {{first_name}}, {{name}}, {{email}}, {{agent_name}}, {{agent_first_name}}, {{ticket}}, {{subject}} and {{server}}. One with nothing on file stays as written and a toast names it, so you can fill it in by hand.
  3. A reply that also changes the ticket shows a chip, such as Sending also sets status to on hold. Select the X on the chip to send the reply without that change.
  4. Tick Close after sending to send the reply and close the ticket in one step. When the canned reply would have set another status, closing wins.
  5. Send. A double click or a retry after a lost answer sends one message.

We email your reply to the customer, and they also read it on your storefront's support page. Replying to a ticket nobody holds makes it yours, within your claim limit, unless you close it with the same reply. Replying to a closed ticket reopens it, and the button says Send and reopen.

  • An internal note tells your team something. The customer never sees it. You can add one to a closed ticket too, to record what happened after it closed; it stays closed.
  • Notes on the customer, in the right column, are saved on the customer instead, so the next person to help them sees them on every ticket of theirs.
  • The console shows which teammates have the ticket open, so two people do not answer at once.
  • Change the priority, department or status from the column as the work moves. Tier 3 can also move the ticket to another of your customers.

Know when Coritan staff answer

Section titled Know when Coritan staff answer

Coritan's support staff can read your organization's conversations from Coritan's own console and answer them. They also add notes, change the priority, department and status, close and reopen, and pass a conversation to one of your members within that member's tier and claim limit. A reply from Coritan staff carries their name, as the customer sees it too. Only your members hold conversations, so a reply from Coritan staff leaves the conversation with whoever held it, unless the person writing is also one of your members. Your audit log records each change they make, as Coritan.

Close a ticket when the matter is settled, with Close ticket, or Close and next, which closes it and opens the next ticket waiting. The customer can reopen it, and once it is closed they can rate it from 1 to 5 with a comment. Closing ends any server access the conversation lent, as Ask for logs or server access explains.

When a customer writes about the same matter twice, close one ticket as a duplicate of the other: open the ⋯ menu and choose the other ticket under Same issue as. Both must belong to that customer, and the one you keep must be open. We tell the customer that the matter carries on in the other ticket, and leave an internal note there that points back. You land on the ticket you kept.

All of these are in the ticket's ⋯ menu and ask for a note for whoever picks the ticket up:

  • Release to the queue puts it back for whoever takes it next. We keep your note as an internal note. You can release your own tickets, and Tier 3 can release anyone's.
  • Transfer moves it to a teammate, to a department, or both. A transfer to a department puts it back in the queue there and sets its targets to that department's.
  • Tier 3 can give a ticket straight to a teammate with Assigned to in the right column.
  • Escalate it to Tier 2 or Tier 3 when it needs more access or experience, with a note on what you tried. It goes back to the queue, where only that tier and above can take it. Tier 1 can choose Tier 2 or Tier 3, and Tier 2 only Tier 3. On an escalated ticket Tier 3 sees Change the escalation, which can lower it or clear it so any tier can take the ticket again.

The member you hand a ticket to must be able to answer it and have room under their claim limit. A change of holder ends any server access the ticket lent to the member who held it.

When you need to see a customer's server, ask the customer from the ticket. The ticket must be open and belong to a customer account, and a teammate must not hold it. Asking takes a ticket nobody holds for you.

  1. In the Servers card of the right column, choose Ask for logs, or Ask for access from Tier 2. The card lists the customer's servers, and marks the one the ticket is about.
  2. Choose the server. It must be one of this customer's.
  3. Ask for one of these, with a message of up to 500 characters that says why:
    • Logs, from Tier 1: latest shares logs/latest.log, and folder also shares up to 4 of the newest archived logs.
    • Server access, from Tier 2: basic gives the console, power and file access, and full gives everything a customer can give a subuser except reinstalling, restoring or deleting a snapshot or backup, and deleting a database.
  4. Choose Send the request. Wait for the customer to approve or decline it in their conversation. Nothing is shared or granted until they approve, and a support session on their account cannot approve for them.

The request shows as a card in the conversation. Withdraw takes back a request the customer has not answered, Open in panel opens an approved server in the panel as your own account, and Release access gives access back.

When the customer approves logs, we copy the files into the conversation as attachments from the customer. A file over 5 MB keeps its first 256 KB and its end, with a line that says how much we left out.

When the customer approves access, we add your storefront account to the server as a subuser, and the conversation says so. Your storefront account is the customer account the console signs you in to on your storefront. Unless an admin chose another, it is the one with your email, which we create the first time you sign in to the console. An admin can attach a different account or make you console-only, as Change a member's storefront account explains, and you need an active storefront account to ask for access. /staff/me lists the servers your storefront account can open, and lets you leave one. The access ends when:

  • the conversation closes;
  • you release it, or the conversation is released, escalated or goes to another member;
  • the customer removes it, or removes you from the server;
  • you move below Tier 2, or leave the team.

You can withdraw a request the customer has not answered. When sharing the logs or adding the subuser fails, the request says why and the customer can approve it again.

Escalate a conversation to Coritan

Section titled Escalate a conversation to Coritan

When your team needs us, Tier 3 can escalate a ticket to Coritan's support: open the ⋯ menu and choose Escalate to Coritan support. We open a conversation on your own Coritan account, with the subject [Escalated] and the subject of the customer's conversation, and the customer's conversation shows a line with our conversation's number. Ours carries only that number and subject, so add what we need to know on your Coritan dashboard. The customer's conversation stays open in your inbox: keep the customer up to date there.

Open a conversation for a customer

Section titled Open a conversation for a customer

Tier 3 can start a conversation with a customer, after a phone call or about something your team noticed first, with New ticket in the inbox's More menu, or Open a ticket on a customer's page. Give it a subject of up to 255 characters, your message, a priority and a department, and the order it is about if there is one. The customer sees a line saying that staff opened it for them, then your message, and we email it to them. The conversation is yours unless you untick Assign it to me, and the paid support rule below does not apply to it.

Save replies for common answers

Section titled Save replies for common answers

/staff/inbox/canned is the team's library of canned replies, for Tier 1 support and up to read. Each reply is a card with its title, its shortcut typed as /shortcut, its text, its department, and how often it was used (Used 12 times, counted when the message holding it goes out). Three figures lead the page: Replies, Change the ticket, and Most used. Search by title, shortcut or text, narrow by department or to the replies that change the ticket, and sort by Most used, A to Z or Recently changed.

Tier 3 writes, changes and deletes them; below Tier 3 the New reply button and each card's Edit stay dimmed. Choose New reply, or Edit on a card, and fill in:

  • Title, up to 200 characters, and Shortcut, up to 50 letters, digits, - and _. The shortcut follows the title until you change it.
  • Department: the composer offers the reply first on that department's tickets. The reply stays available on every ticket.
  • Body, up to 10,000 characters. Choose a placeholder button to drop it in where the cursor is, and an example line shows how it reads for a sample customer.
  • Under When a reply made from it is sent, set the status to Awaiting customer, On hold or Closed, set the priority, and add up to 10 tags of up to 40 characters, in lower case. A preview shows the chip the composer will show. The ticket changes after the reply is sent, with one update. A canned reply that closes the ticket sends and closes in one step.

/staff/inbox/analytics, Analytics in the inbox header, shows how fast the team answers, how well, and where it is stuck. It opens for Tier 3 support and up; below that it shows one line that says so and asks the platform for nothing. The period picker sets the period and what to compare it with. The page reads at most 366 days and says when it held a longer range to that.

Part What it shows
Right now Waiting, Open, On hold, Past SLA, Escalated and Agents online, each opening its inbox view. It refreshes every minute.
This period Opened, Closed, First reply, Resolution, Replied on time and Rating, each against the comparison. First reply and Resolution are medians, with the time 90% of them fall within. Replied on time is the share of reply targets kept.
Charts Conversations by day, week or month (chat and email), Opened and closed, Time to the first reply, Backlog by age, Ratings, Channels, and Busiest hours by weekday and hour in your brand's time.
Agents For each person: Closed, Holding against their limit, First reply, Resolution, Rating and Last reply. A row opens that person's open tickets in the inbox.
Departments For each department: Opened, First reply, Target, On time and Rating. A row opens its open tickets.

Reply figures cover the tickets opened in the period, and resolution and ratings cover the tickets closed in it. In the by day chart and in Channels, a ticket that used both chat and email counts as email. When more than 20,000 tickets fall in a period, the times and ratings read the newest 20,000, a callout says so, and the counts stay exact. The tables sort in the browser.

Settings has a Who holds what panel on its Support desk tab. It lists everyone who answers tickets, with their role, the open tickets on their name against how many they may hold (4 of 10, or no limit), and when they last replied. A last reply more than a day old on a person who holds tickets turns red, because a customer is waiting behind that name. A row opens that person's open tickets in the inbox, and Open the inbox opens them all. See who holds what describes the panel from the settings side.

Change many conversations at once

Section titled Change many conversations at once

Tier 3 can tick up to 100 tickets in /staff/inbox and take them, drop them back into the queue, close them, or set their priority or department. We skip any conversation outside your organization.

Limit support to paying customers

Section titled Limit support to paying customers

Coritan can limit your organization's support to paying customers; the console and the dashboard have no switch for it, so contact support to turn it on or off. With it on:

  • anyone can write to the abuse, security, legal and sales departments;
  • a customer who has ever had an invoice above zero can write to billing and payments;
  • every other department needs a service that costs money.

A customer who may not open a conversation gets a message that says why, on your storefront, by email and in Discord alike. The rule does not apply to conversations your team opens. A Priority Support service costs money, so a customer who has only that service can write to every department.

An organization can sell Priority Support: a paid plan per customer account that covers every server on the account. Coritan puts it on the shelves of the storefronts that sell it, as a standalone product in the Support category, so your team does not set it up. A customer buys it from your storefront like any other product, and it works while the service is active. A customer who cancels at the end of the term keeps it until that date. A cancellation, a termination or the end of the term takes it away, and the customer's next ticket opens as a standard one. A customer can hold one Priority Support service at a time: an order for it, alone or as a line of a basket, is refused while they have one that is unpaid, active or suspended, and a basket cannot hold it twice.

For a customer who has it:

  • Every new ticket opens at High priority or higher, with a first reply target of 1 hour. The customer can still choose Critical.
  • The row in the inbox and the ticket itself carry a Priority badge, and support_tier is priority in the API. The queue puts these tickets ahead of standard tickets that opened at Medium or Low.
  • The terms are stored with the ticket when it opens, so a transfer, an escalation or a reopen keeps the target the customer was promised. A customer who buys or loses the plan later changes only the tickets they open from then on.
  • It applies to every way a customer opens a ticket for you: your storefront, email to your support address, Discord and the contact form. A ticket your team opens for a customer does not: it keeps the priority your team chose and the department's targets.

Every other customer is on the standard tier. In a storefront that sells Priority Support, a standard customer's High or Critical choice opens at Medium, with no error, and Low and Medium stay as chosen. Your staff can still change a ticket's priority afterwards. The standard first reply target is the organization's standard_first_reply_minutes setting, from 1 to 10080 minutes, and a storefront without the setting keeps each department's target. The console and the dashboard have no field for it, so contact support to change it.

A storefront can sell Server Management for a server. While the add-on is active on a server, your support team installs and configures plugins, mods and modpacks on it when the customer asks by ticket. A ticket about such a server is a managed ticket.

  • The inbox row and the ticket carry a Managed badge, and managed is true in the API. The ticket also gets the tag managed when it opens, when the server's owner or your team opens it, so the Tags filter and a saved view can find these tickets.
  • The badge follows the add-on, not the ticket. We read it each time a ticket is listed, so a ticket opened before the purchase shows the badge once the add-on is active, and loses it when the add-on ends or is suspended. The tag stays on a ticket that has it.
  • Managed tickets sort like any ticket from a paying customer: the add-on is a paid service, so the queue lists them with the other paying customers' tickets, by priority and then by age. There is no separate lane for them.
  • A customer asks by choosing the server when they open a ticket. The ticket is linked to that server and its order. Only the server's owner can ask for the service. A customer who was given access to the server can open an ordinary ticket about it, but the ticket does not get the tag managed, and the server is not in the list of managed servers they choose from. It still shows the Managed badge, because the badge follows the server, so change the server only when its owner asks. To work on it, look the server up in Manage customer servers in the staff console by the customer's email, and use its files, console and software pages there. Ask the customer for server access in the ticket only when you need more than that.
  • Nothing stops a customer from opening a ticket about a managed server in any department. The add-on does not change a ticket's priority or first reply target, and a customer who has only the add-on can open a technical ticket like any paying customer.

The customer sees each reply and each change of status on their support page, and by email. The audit log records who took, passed on, escalated, changed and closed each conversation, and each request for logs or server access.

Support access required
The read-only role cannot use the inbox, and some actions need Tier 3. Ask an admin for a higher role.
Conversation not found
The conversation is not in your organization, or it is outside what your tier may read. Tier 1 reads only the queue and its own tickets.
This ticket belongs to another engineer; add an internal note, or ask Tier 3 to reassign it
A teammate holds the ticket. Leave them a note, or ask Tier 3 to give it to you.
This ticket was escalated to Tier 3
The ticket waits for a tier above yours.
409 with error set to claim_limit
You hold as many open tickets as Tier 1 may. Close or release one first. When you hand a ticket on, the message names the teammate whose limit it is.
Handing a ticket to a teammate is a transfer
Below Tier 3 you cannot assign a ticket to someone else. Transfer it instead.
Escalate to a tier above your own (Tier 1)
Tier 1 escalates to Tier 2 or Tier 3, and Tier 2 to Tier 3.
Take the ticket before asking the customer for anything
A teammate holds the ticket. Ask them, or have Tier 3 give it to you.
Asking for access to a customer's server is Tier 2 work
Tier 1 can ask for logs only. Escalate the ticket to Tier 2.
Server access is given to your own customer account on this brand, and you have none. An admin can link one on the Team page.
You have no storefront account, or it is not active. Ask an admin to attach one on /staff/team.
You already asked for that on this ticket
The same request still waits for the customer, or the access it asked for is still in place.
Reopen the ticket before asking the customer for anything
The ticket is closed. Reopen it first.
Only the customer can answer this. A support session cannot answer for them.
The customer must approve a request while signed in as themselves.
Customer not found in this organization
The customer ID is not one of your organization's customers.
A ticket takes at most 10 tags
A request listed more than 10 tags once blanks and repeats were dropped. Send 10 or fewer. The console never sends more.

The staff routes live under https://api.coritan.com/api/v1/orgs/{org_slug}/chat/staff/, and take a console session or a member's access token as The staff console explains. The customer routes live under /chat/conversations/ and /chat/meta, and take the customer's token. Staff support lists both, and your server access lists the two /staff/me/server-access routes.

Shell
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/chat/staff/queue/take-next?audience=paid" \
  -H "Authorization: Bearer $STAFF_TOKEN"

It answers the conversation you now hold, or null when nobody is waiting. It also takes department. GET /chat/staff/queue lists the queue itself, with department, audience, page and limit 1–100 (20 by default).

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/chat/staff/conversations?status=open&late=1&department=billing&q=%231042" \
  -H "Authorization: Bearer $STAFF_TOKEN"

The list puts paying customers first, then the newest activity, and takes:

  • status: a status from Views and figures. open there means every status but closed.
  • priority: low, medium, high or critical.
  • department: a department's slug, matched exactly. An unknown slug lists nothing, because a retired department still has tickets.
  • late: 1 or true keeps the tickets waiting on staff that are past a target, which is what the Past SLA figure counts. 0 or false, or leaving it out, does not narrow the list, and any other word answers 422.
  • q, up to 200 characters, matched against the subject, the last message, the customer's email and the number.
  • assigned_to_me, escalated, and for Tier 3 assigned_to with a member's user_id.
  • audience: paid, free or all.
  • page, and limit 1–100 (20 by default).

Every filter runs before the page is cut, so page and limit walk exactly the tickets that match. Each row has id, conversation_number, subject, status, priority, department, assigned_agent_id, assigned_agent_name, customer_id, user_email, channel, email_from, last_message_at, last_message_preview, tags, waiting_seconds, sla_first_response_due_at, sla_resolution_due_at, sla_breached_first_response, sla_breached_resolution, csat_score, is_free, viewers, escalated_tier, support_tier (priority for a ticket that opened under Priority Support, otherwise null) and managed (true for a ticket about a server that has Server Management, otherwise null). The queue, the take-next route and the conversation read carry it too.

GET /chat/staff/stats takes audience and answers the figures above the inbox, with claim_limit and, for Tier 3, each member's open claims. by_status counts every status (open, awaiting_customer, awaiting_agent, in_progress, on_hold and closed, 0 when empty), and avg_first_response_seconds is the time from opening to the first reply over tickets whose first reply came in the last 30 days, or null when there are none. Both follow audience. The counts your team shares, including every member's claims, are normally no more than 8 seconds old, and up to 2 minutes old on the first request after a quiet spell; the figures that are the caller's own are always current. GET /chat/staff/departments answers every department's slug, name and targets in minutes, and any member can read it.

The console opens a WebSocket at /ws/chat with the member's staff token, for members who answer tickets. After it subscribes to the inbox it hears about new tickets and changes to existing ones, so the inbox and an open ticket update without a refresh and a customer's typing shows. Tier 1 hears only the queue and its own tickets; Tier 2 and up hear the organization. The socket carries no replies: they go through the routes below. While it is down, the page checks every 8 seconds, and a slower check, about every 45 seconds while it is up, catches the few changes it does not carry, such as a priority or tag edit. Both stop while the tab is hidden.

Read and answer a conversation

Section titled Read and answer a conversation

GET /chat/staff/conversations/{conversation_id} answers the conversation with its messages, internal notes included. GET .../messages takes before_id and limit up to 100 (50 by default), and GET .../attachments/{attachment_id} downloads a file the customer attached.

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/chat/staff/conversations/5120/messages \
  -H "Authorization: Bearer $STAFF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"body": "Your server is back online. Reply here if it stops again.", "close": true}'

body is 1–10,000 characters. client_request_id, up to 64 characters, makes a retry return the first message instead of sending a second one. Staff replies carry no attachments. POST .../internal-note takes a body of 1–10,000 characters, and POST .../viewing answers the other members who have the conversation open in viewers.

PATCH /chat/staff/conversations/{conversation_id} takes priority, department, status, tags and, for Tier 3, customer_id. tags replaces the ticket's tags: they are trimmed and lower case, with blanks and repeats dropped, each up to 40 characters, and more than 10 after that answers 422 (A ticket takes at most 10 tags). An empty list clears them. A status of closed closes the conversation, and any other status on a closed one reopens it. POST .../close and POST .../reopen do the same on their own. POST .../duplicate takes {"of": 5118}, the ID of the conversation to keep.

Assign, transfer, release and escalate

Section titled Assign, transfer, release and escalate
Route Body Who
POST .../assign {} to take it, or {"agent_id": 14} to give it Tier 1 takes; Tier 3 gives
POST .../transfer agent_id or department Tier 1
POST .../release optional note, up to 2,000 characters The holder, or Tier 3
POST .../escalate-tier tier 2 or 3, or null to clear; optional note Tier 1; clearing needs Tier 3
POST .../escalate none Tier 3

agent_id is a member's user_id, which GET /staff/team lists.

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/chat/staff/conversations/5120/requests \
  -H "Authorization: Bearer $STAFF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"kind": "logs", "server_uuid": "3f6c2a9e-8b1d-4c57-9e02-5d7a41b8c613", "scope": "folder", "note": "The server stops a few minutes after it starts."}'

It answers 201 with the request. kind is logs, with scope latest or folder, or server_access, with scope basic or full. A request's status is pending, approved, declined, cancelled, failed or revoked. GET .../requests lists the conversation's requests, newest first and at most 50. POST .../requests/{request_id}/cancel withdraws one the customer has not answered, and POST .../requests/{request_id}/release, from Tier 2, gives back server access. Only the member who asked, or Tier 3, can do either.

GET /staff/me/server-access answers your linked customer_id and the servers your customer account is a subuser on, each with its permissions and, when a conversation lent it, via_ticket. POST /staff/me/server-access/{server_uuid}/leave answers {"ok": true} and ends that access.

POST /chat/staff/conversations takes customer_id, subject (1–255 characters), body (1–20,000), priority (medium by default), department (up to 50 characters), an optional service_id of the customer's, and assign_to_me (true by default). It answers 201 with the conversation.

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/chat/staff/conversations/bulk \
  -H "Authorization: Bearer $STAFF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ids": [5120, 5121, 5133], "action": "priority", "value": "high"}'

action is assign_me, unassign, close, priority or department, and value holds the priority or department. It answers the action, how many IDs were requested, and how many changed.

GET /chat/staff/canned-responses lists saved replies, and with department only that department's and those with none. Each has usage_count and last_used_at. POST takes title, shortcut, body, department, is_shared and actions, PUT /chat/staff/canned-responses/{response_id} changes any of them, and DELETE removes one. We store is_shared, but every member who can use the inbox reads every saved reply. actions is what sending a reply made from the saved reply should also do: a status (awaiting_customer, on_hold or closed), a priority and up to 10 add_tags of up to 40 characters, or null. We store it and return it. The staff console applies it with one PATCH after the send succeeds, and turns a closed status into close: true on the send; a tool of yours can do the same.

POST /chat/staff/canned-responses/{response_id}/used, for Tier 1 and up, adds 1 to usage_count, sets last_used_at and answers {"usage_count": 13}. It does not change the reply's edited time. A reply of another organization, or an unknown ID, answers 404. Each member may count 600 uses an hour.

Shell
curl "https://api.coritan.com/api/v1/orgs/acme/chat/staff/analytics?from=2026-09-01&to=2026-09-30&compare=previous" \
  -H "Authorization: Bearer $STAFF_TOKEN"

GET /chat/staff/analytics needs Tier 3 support or above. from and to are days in your brand's time zone, the last 30 days when left out and at most 366. compare is previous, week, month, year, custom with compare_from and compare_to, or none. A bad word, a period over 366 days, or a custom comparison without both days answers 422.

The answer has period, opened, closed, first_reply and resolution (each with median and p90 in seconds, and first_reply also on_time_pct), csat with average, count and a distribution of score and count from 5 down to 1, by_day (chat and email opened and conversations closed for each day), first_reply_buckets, backlog_by_age, by_agent, by_department, a heatmap of 7 weekdays from Monday by 24 hours, right_now (waiting, oldest_waiting_seconds, open, on_hold, past_sla, escalated_waiting and agents_online) and previous, the headline figures of the comparison period or null. Quantiles are nearest rank. They read at most 20,000 conversations for each list, and truncated is true when there were more.

Build a customer's support page

Section titled Build a customer's support page

A storefront of your own calls the customer routes with the customer's token:

Shell
curl -X POST https://api.coritan.com/api/v1/orgs/acme/chat/conversations \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"subject": "Server will not start", "body": "It stops a few minutes after it starts.", "department": "technical", "priority": "high"}'

It answers 201 with the conversation, whose priority is the one it opened at, whose support_tier is priority or null and whose managed is true or null. In a storefront that sells Priority Support, a customer without it who sends high or critical gets a conversation at medium, and low stays low. subject is up to 300 characters and body 1–10,000, with an optional service_id and client_request_id. service_id is the id of one of the customer's own services, or of a server another customer shared with them. A ticket about a server that has Server Management gets the tag managed when the customer owns the server. A ticket about a server shared with the customer does not. Any other id answers 400 with That service does not belong to your account. GET /chat/meta answers what the form needs first: each department with whether this customer may write to it, the priorities, the attachment limits, and in access the reason a customer who may not open one reads.

Route What it does
GET /chat/support-tier The signed in customer's support tier: tier (standard or priority), first_reply_minutes for their next ticket, standard_first_reply_minutes and priority_first_reply_minutes, allowed_priorities, their Priority Support service (id, status, billing_cycle, amount, next_due_date and cancel_at_end) and the offer to show a customer who can buy it (org_product_id, name, description, benefits and pricing rows with org_pricing_id, billing_cycle, price and currency). offer is null when the storefront does not sell it or the customer has it. A storefront that does not sell it allows every priority. Order the offer with POST /storefront/order and its two ids.
GET /chat/managed-servers The signed in customer's servers that have Server Management, for the server choice on the ticket form: servers, each with org_service_id (send it as service_id), server_uuid, name and hostname. It lists only the servers the customer owns, not servers shared with them, leaves out a server that is being deleted, and answers an empty list when none has the add-on.
GET /chat/conversations The customer's conversations, newest activity first. Takes status, priority, q, page and limit 1–100.
GET /chat/conversations/{conversation_id} and GET .../messages One conversation, without internal notes. messages takes before_id, after_id and limit up to 100.
POST .../messages A reply of 1–10,000 characters. A closed conversation answers 400 Conversation is closed, so reopen it first.
POST .../attachments One file as file, up to 25 MB, of a type GET /chat/meta lists.
POST .../read Marks our replies read, up to up_to_message_id when you send it.
POST .../close and POST .../reopen Closes or reopens the conversation.
POST .../csat A score of 1–5 and a comment of up to 500 characters, once the conversation is closed.
POST .../requests/{request_id}/approve, /decline and /revoke Answers a request for logs or access, or removes access given earlier.

A conversation that is not the customer's answers 403 Access denied.

API operations on this page

MethodPathWhat it does
GET/api/v1/orgs/{org_slug}/chat/conversationsList customer conversations
POST/api/v1/orgs/{org_slug}/chat/conversationsCreate customer conversation
GET/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}Get customer conversation
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/attachmentsUpload customer attachment
GET/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/attachments/{attachment_id}Download customer attachment
GET/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/attachments/{attachment_id}/thumbnailLets a thread show an image inline instead of a download link
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/closeClose customer conversation
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/csatRate customer conversation
GET/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/messagesGet customer messages
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/messagesSend customer message
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/readMark customer conversation read
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/reopenReopen customer conversation
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/requests/{request_id}/approveApprove ticket request
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/requests/{request_id}/declineDecline ticket request
POST/api/v1/orgs/{org_slug}/chat/conversations/{conversation_id}/requests/{request_id}/revokeTake back access given from this ticket, before it closes
GET/api/v1/orgs/{org_slug}/chat/staff/analyticsHow the support team is doing over a period, with the period before it for comparison
GET/api/v1/orgs/{org_slug}/chat/staff/canned-responsesList org canned responses
POST/api/v1/orgs/{org_slug}/chat/staff/canned-responsesCreate org canned response
PUT/api/v1/orgs/{org_slug}/chat/staff/canned-responses/{response_id}Update org canned response
DELETE/api/v1/orgs/{org_slug}/chat/staff/canned-responses/{response_id}Delete org canned response
POST/api/v1/orgs/{org_slug}/chat/staff/canned-responses/{response_id}/usedCount org canned response use
GET/api/v1/orgs/{org_slug}/chat/staff/conversationsTickets, newest activity first
POST/api/v1/orgs/{org_slug}/chat/staff/conversationsOpen a ticket on a customer's behalf
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/bulkBulk org staff conversations
GET/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}Get org staff conversation
PATCH/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}Update org conversation
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/assignClaim a ticket, or with agentid (Tier 3 and above) give it to a teammate
GET/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/attachments/{attachment_id}The file a customer attached, for the staff member reading the ticket
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/closeClose org staff conversation
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/duplicateClose this ticket as a duplicate of another of the same customer's
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/escalateEscalate org conversation
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/escalate-tierPass a ticket up to Tier 2 or Tier 3, back into the queue there
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/internal-noteA note for the desk, on any ticket the caller may read
GET/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/messagesGet org staff messages
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/messagesA reply to a closed ticket reopens it first
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/releaseGive a claimed ticket back to the queue
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/reopenReopen org staff conversation
GET/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/requestsEvery request on the ticket, newest first, as its card shows it
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/requestsCreate ticket request
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/requests/{request_id}/cancelWithdraw a request the customer has not answered yet
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/requests/{request_id}/releaseGive back server access before the ticket closes: done with it, or handing the work on
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/transferTransfer org conversation
POST/api/v1/orgs/{org_slug}/chat/staff/conversations/{conversation_id}/viewingOrg ticket viewing
GET/api/v1/orgs/{org_slug}/chat/staff/departmentsDepartments with their names and SLAs, for anything staff-side that shows a ticket
GET/api/v1/orgs/{org_slug}/chat/staff/queueUnclaimed tickets waiting for an answer, at the caller's tier or below
POST/api/v1/orgs/{org_slug}/chat/staff/queue/take-nextClaim the ticket at the front of the queue and hand it back
GET/api/v1/orgs/{org_slug}/chat/staff/statsThe numbers above the inbox, under the audience the request carries
GET/api/v1/orgs/{org_slug}/chat/metaGet customer support meta
GET/api/v1/orgs/{org_slug}/chat/support-tierWhich support tier the signed-in customer has, and what it changes
GET/api/v1/orgs/{org_slug}/chat/managed-serversThe servers you own that have Server Management
GET/api/v1/orgs/{org_slug}/staff/me/server-accessMy server access
POST/api/v1/orgs/{org_slug}/staff/me/server-access/{server_uuid}/leaveStop being a subuser on a server
GET/api/v1/orgs/{org_slug}/settings/support-mailboxShow the organization's own support mailbox
PUT/api/v1/orgs/{org_slug}/settings/support-mailboxConnect or change the organization's own support mailbox
DELETE/api/v1/orgs/{org_slug}/settings/support-mailboxDisconnect the organization's own support mailbox
POST/api/v1/orgs/{org_slug}/settings/support-mailbox/testCheck that Coritan can sign in to the mailbox
POST/api/v1/orgs/{org_slug}/settings/support-mailbox/verifySend the confirmation message that makes the mailbox active