Catch Freshdesk tickets that are past or near their SLA due time

Every business hour: Freshdesk tickets past or within an hour of their first response or resolution due time, and who picks each one up.

Runs
Weekdays, hourly 9:30 to 17:30
Posts
Asks you

From your apps to your board

How the skill works: your agent reads exact times from Freshdesk; freshdesk address from What you tell it, weekdays, hourly 9:30 to 17:30, and gives you a question for you and a telegram ping and the report in the chat.

Reads

  • FreshdeskExact times
  • What you tell itFreshdesk address
reads
Your agentClaude Code, Codex, Cursor or GeminiWeekdays, hourly 9:30 to 17:30
posts

You get

  • A question for youOn your board, answered with a tap
  • A Telegram pingOnly when it needs your answer, if you connect Telegram
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Past due: tickets past their first response or resolution time.
  • Due within the hour, with time left.
  • Each ticket: subject, which due time, how far past or ahead, agent and group.
  • The ask: who picks up the ones with no agent.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

Acme SupportFreshdesk SLA breaches · Claude Code

4 tickets past due, 3 more within the hour

Who picks up the 2 tickets with no agent?

4 tickets are past their due time and 3 will reach it within the hour. Two of the overdue tickets have no agent.

TicketSubjectDue timeWhenAgent
#9182Refund not receivedFirst response1 h 20 min agoNo agent
#9175Cannot add a teammateResolution45 min agoAna
#9190Invoice address is wrongFirst response30 min agoNo agent
#9168CSV export failsResolution10 min agoBen
#9194Password reset email missingFirst responseIn 15 minChris
#9171Plan downgrade questionResolutionIn 35 minAna
#9196App crashes on loginFirst responseIn 50 minBen

Both unassigned tickets are billing questions that landed in the general queue.

Resolve
An example with made-up numbers. Your agent posts your real ones.

What it does

Freshdesk sets a first response and a resolution due time on every ticket, and the overdue view fills up quietly while agents work their own queues. Support leads usually learn about a missed SLA from the report, or from the customer.

Every hour the agent finds open tickets that are past either due time or will reach it within the hour, checks whether a first response already went out, and lists them by urgency with the assigned agent. Tickets with nobody on them get the question on the card.

How it works

  1. 1Filter tickets due by tomorrow

    Call GET /api/v2/search/tickets?query="status:2 AND (fr_due_by:<'2026-10-18' OR due_by:<'2026-10-18')" with tomorrow's date. The filter takes dates without times, in UTC, returns 30 tickets per page and stops at 10 pages.

  2. 2Check the exact times

    Read fr_due_by, due_by, fr_escalated, is_escalated, responder_id and group_id. For tickets near their first response time, call GET /api/v2/tickets/{id}?include=stats; if stats.first_responded_at is set, only the resolution time still counts.

  3. 3

    3Sort by urgency

    Past due first, then due within 60 minutes, each with which time it is (first response or resolution) and how far past or ahead. Name agents and groups from GET /api/v2/agents and GET /api/v2/groups.

  4. 4Ask, then assign

    Post the list as an ask when any ticket is past due or has no agent. On an answer, call PUT /api/v2/tickets/{id} with responder_id (and group_id if it moves group). Post an all-clear when nothing is late.

  5. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/freshdesk-sla-breaches/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the freshdesk-sla-breaches skill

    Or paste the prompt instead of installing:

    promptUsing the Freshdesk API v2, find open tickets whose first response due time (fr_due_by) or resolution due time (due_by) is already past or falls within the next 60 minutes. Ignore the first response time on tickets that already have a first response. List them past due first, with subject, which due time, how far past or ahead, agent and group. Then ask me who should pick up the tickets with no agent, and assign them only after I answer.
  3. Put it on a schedule

    Weekdays, hourly 9:30 to 17:30, from cron on any machine where Claude Code is signed in:

    crontab30 9-17 * * 1-5 claude -p "Run the freshdesk-sla-breaches skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: freshdesk-sla-breaches
description: "Every business hour: Freshdesk tickets past or within an hour of their first response or resolution due time, and who picks each one up. Use when the user asks for this, or when it runs on a schedule."
---

# Freshdesk SLA breaches

Every business hour: Freshdesk tickets past or within an hour of their first response or resolution due time, and who picks each one up.

Freshdesk sets a first response and a resolution due time on every ticket, and the overdue view fills up quietly while agents work their own queues. Support leads usually learn about a missed SLA from the report, or from the customer.

Every hour the agent finds open tickets that are past either due time or will reach it within the hour, checks whether a first response already went out, and lists them by urgency with the assigned agent. Tickets with nobody on them get the question on the card.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Freshdesk agent API key used as the basic auth user (`FRESHDESK_API_KEY`) for `https://<yourcompany>.freshdesk.com`, with access to the groups you watch.
- SLA policies in Freshdesk, and any custom statuses whose SLA timer keeps running.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Filter tickets due by tomorrow** (Freshdesk): Call `GET /api/v2/search/tickets?query="status:2 AND (fr_due_by:<'2026-10-18' OR due_by:<'2026-10-18')"` with tomorrow's date. The filter takes dates without times, in UTC, returns 30 tickets per page and stops at 10 pages.
2. **Check the exact times** (Freshdesk): Read `fr_due_by`, `due_by`, `fr_escalated`, `is_escalated`, `responder_id` and `group_id`. For tickets near their first response time, call `GET /api/v2/tickets/{id}?include=stats`; if `stats.first_responded_at` is set, only the resolution time still counts.
3. **Sort by urgency**: Past due first, then due within 60 minutes, each with which time it is (first response or resolution) and how far past or ahead. Name agents and groups from `GET /api/v2/agents` and `GET /api/v2/groups`.
4. **Ask, then assign** (Freshdesk): Post the list as an ask when any ticket is past due or has no agent. On an answer, call `PUT /api/v2/tickets/{id}` with `responder_id` (and `group_id` if it moves group). Post an all-clear when nothing is late.

## Route B: the browser

### What you need

- Signed in to Freshdesk as an agent with access to the groups you watch; assigning tickets needs the Agent or Supervisor role on those groups.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://freshdesk.com/login. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open your helpdesk**: Enter your helpdesk address (`<yourcompany>.freshdesk.com`) on the login page; sign-in is already done. Click **Tickets** in the left bar.
2. **Open the Overdue view**: In the views dropdown at the top of the ticket list pick **Overdue**. Read each ticket's number, subject, agent and group, and the due text on the card (**Overdue by** with the time, or **First response overdue**).
3. **Open the Due today view**: Switch to **Due today**, sort by **Due by** ascending, and keep the tickets whose due text is within 60 minutes, noting whether it is the first response or the resolution time.
4. **Check the first response**: For a ticket near its first response time, open it and look at the conversation: if an agent reply already went out, only the resolution time still counts.
5. **Assign after the answer**: Report past due first, then due within the hour, with subject, which due time, how far past or ahead, agent and group, and ask who picks up the tickets with no agent. After the answer, open the ticket and set **Agent** (and **Group**) in the properties panel, then **Update**.

Note: The Overdue and Due today views include only statuses whose SLA timer is running, so pending tickets are left out, as in the API route. Each view shows 30 tickets per page; page through when the list is long.

## The report

- **Past due**: tickets past their first response or resolution time.
- **Due within the hour**, with time left.
- **Each ticket**: subject, which due time, how far past or ahead, agent and group.
- The ask: who picks up the ones with no agent.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "freshdesk-sla-breaches/<date of this run, e.g. 2026-10-16>",
  "item_key": "freshdesk-sla-breaches",
  "project": "Acme Support",
  "source": "Freshdesk SLA breaches skill",
  "kind": "action",
  "title": "4 tickets past due, 3 more within the hour",
  "summary": "**4 tickets** are past their due time and **3** will reach it within the hour. Two of the overdue tickets have no agent.",
  "action": {
    "request": "Who picks up the 2 tickets with no agent?",
    "options": [
      "Billing group lead",
      "Assign to me",
      "Round-robin in Tier 1",
      "Leave as is"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Ticket",
          "Subject",
          "Due time",
          "When",
          "Agent"
        ],
        "align": [
          "left",
          "left",
          "left",
          "left",
          "left"
        ],
        "rows": [
          [
            "#9182",
            "Refund not received",
            "First response",
            "1 h 20 min ago",
            "No agent"
          ],
          [
            "#9175",
            "Cannot add a teammate",
            "Resolution",
            "45 min ago",
            "Ana"
          ],
          [
            "#9190",
            "Invoice address is wrong",
            "First response",
            "30 min ago",
            "No agent"
          ],
          [
            "#9168",
            "CSV export fails",
            "Resolution",
            "10 min ago",
            "Ben"
          ],
          [
            "#9194",
            "Password reset email missing",
            "First response",
            "In 15 min",
            "Chris"
          ],
          [
            "#9171",
            "Plan downgrade question",
            "Resolution",
            "In 35 min",
            "Ana"
          ],
          [
            "#9196",
            "App crashes on login",
            "First response",
            "In 50 min",
            "Ben"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Both unassigned tickets are billing questions that landed in the general queue.",
        "tone": "info"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Weekdays, hourly 9:30 to 17:30 (`30 9-17 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
30 9-17 * * 1-5 claude -p "Run the freshdesk-sla-breaches skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/freshdesk-sla-breaches#schedule

Source: https://briefkin.dev/skills/freshdesk-sla-breaches

What your agent needs

  • A Freshdesk agent API key used as the basic auth user (FRESHDESK_API_KEY) for https://<yourcompany>.freshdesk.com, with access to the groups you watch.

  • SLA policies in Freshdesk, and any custom statuses whose SLA timer keeps running.

Connecting Freshdesk

  1. MCP server. Freshdesk's API documentation doesn't describe an MCP server as of October 2026. Community MCP servers exist; they use the same API key, which can also create and update tickets, so check their tools before you connect one.
  2. API v2 with an API key. Each agent finds their key under Profile settings in Freshdesk. The skill reads FRESHDESK_DOMAIN (acme for acme.freshdesk.com) and FRESHDESK_API_KEY, and sends basic auth with the key as the username and X as the password. Current plans allow 3,000 to 5,000 calls an hour, and failed calls count toward the limit.

The key carries every right of the agent who owns it, so create a dedicated agent whose role and group access cover only what the report reads.

Questions

Why does the search use dates instead of exact times?

The Filter Tickets API accepts dates, not times, for due_by and fr_due_by, and returns at most 300 tickets. The skill asks for everything due by tomorrow and works out the exact minutes itself from the ticket fields.

Are pending tickets included?

The skill checks Open tickets plus any custom statuses you name. Statuses where your SLA timer is switched off, often Pending and Waiting on customer, are left out because their due times are not running.

Do I need Briefkin to use the Freshdesk SLA breaches skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a asks you, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Freshdesk pages themselves: the agent opens freshdesk.com/login in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Answer your agents from one board, or from Telegram

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.