Macha

Freshdesk API Errors & Rate Limits: Troubleshooting

Abbas, Customer Support & AI, Macha

Written by

Ankeet Guha, Co-founder & CTO, Macha

Reviewed by

Published July 24, 2026

Updated July 24, 2026

Every integration that touches Freshdesk — a sync job, a reporting script, a bot, an AI agent — eventually meets one of three responses that stop it cold: a 401 that says your credentials are wrong, a 403 that says you're not allowed, or a 429 that says you've made too many calls too fast. The good news is that Freshdesk is unusually honest about what went wrong. Every response carries a status code with a documented reason, a JSON body that names the failing field, and a set of rate-limit headers that tell you exactly how much budget you have left before the next call bounces. This guide decodes the errors you'll actually hit, reads the X-RateLimit headers line by line, shows you how to back off cleanly, and lays out the per-minute limits by plan so you can size an integration before it starts throwing 429s in production.

Freshdesk API Errors & Rate Limits: Troubleshooting

The three errors you'll actually hit

Freshdesk documents a full table of status codes, but in day-to-day integration work three of them account for almost every ticket a developer opens. Per Freshworks' Status codes and its reasons documentation, here's what each one means and where to look first.

401 — Authentication Failure. This is the most common and the most misdiagnosed. The docs define it plainly: the Authorization header is either missing or incorrect. In practice that means a wrong API key, a key from a different agent than you think, a typo in the Base64 encoding, or a request that forgot the auth header entirely. The JSON body returns {"code":"invalid_credentials", ...}. Note the trap: a 401 does not mean your account or endpoint is wrong — it means Freshdesk couldn't verify who you are. If the same key logs into the UI fine but fails on the API, you almost certainly have an encoding or header-format problem, not a bad key.

403 — Access Denied. Authentication succeeded, but this identity isn't allowed to do this thing. A 403 usually means the agent behind the key lacks the role for the action (many admin endpoints require an admin key), or you've hit an account-level ceiling like an agent-seat limit. Swapping in a key from an account admin resolves the majority of 403s.

429 — Rate Limit Exceeded. "The API rate limit allotted for your Freshdesk domain has been exhausted." This isn't about you — it's about your whole account. We'll spend the rest of this guide on it, because it's the one that scales into a problem exactly when your integration starts succeeding.

Reading the X-RateLimit headers

Here's the part that saves you: Freshdesk returns rate-limit headers on every response — success or failure — so you never have to guess how close you are. Per the Freshdesk API developer documentation, three headers matter:

X-RateLimit-Total: 700
X-RateLimit-Remaining: 426
X-RateLimit-Used-CurrentRequest: 1
  • X-RateLimit-Total is your ceiling for the current minute window (here, an Enterprise account at 700).
  • X-RateLimit-Remaining is how many calls you have left before the next one 429s. This is the number to watch.
  • X-RateLimit-Used-CurrentRequest is what the call you just made cost — usually 1, but some heavier operations cost more.

The practical rule: read X-RateLimit-Remaining on every response and slow down before it reaches zero, rather than firing blindly and catching 429s after the fact. A single failed call still counts against your budget, which is exactly what makes the screenshot below instructive — even a 401 with bad credentials decrements the counter.

A real 401 Unauthorized response from the live Freshdesk API (deliberately bad credentials), rendered as a terminal. Shows the genuine JSON error body {"code":"invalid_credentials", ...} plus real response headers including x-ratelimit-remaining: 48 / x-ratelimit-total: 50, illustrating that even failed calls count against the per-minute rate limit.
A real 401 Unauthorized response from the live Freshdesk API (deliberately bad credentials), rendered as a terminal. Shows the genuine JSON error body {"code":"invalid_credentials", ...} plus real response headers including x-ratelimit-remaining: 48 / x-ratelimit-total: 50, illustrating that even failed calls count against the per-minute rate limit.

That capture is from the demousermacha demo account on a trial plan — note the x-ratelimit-total: 50 — and it makes the point cleanly: authentication failed, but the request still cost budget. If you're wiring up auth for the first time, our walkthroughs on how to find your Freshdesk API key and the broader Freshdesk API explained cover the credential side in detail.

What happens on a 429 — and how to back off

When you exhaust the limit, Freshdesk returns HTTP 429 with a Retry-After header giving the number of seconds to wait before the window resets:

HTTP/1.1 429
Retry-After: 34

The correct response is not to retry immediately — that just burns more budget and can extend the block. Instead:

  1. Catch the 429 specifically (don't lump it in with generic 5xx handling).
  2. Read Retry-After and sleep for exactly that many seconds. Don't guess a fixed delay.
  3. Add jitter — a small random offset on top of Retry-After — so that many parallel workers don't all wake up and retry in the same instant.
  4. Cap retries with exponential backoff for anything the header doesn't cover, so a persistent problem fails loudly instead of hammering forever.

Here's a minimal, honest pattern in pseudocode:

resp = call_freshdesk()
if resp.status == 429:
    wait = int(resp.headers["Retry-After"]) + random(0, 2)
    sleep(wait)
    retry()   # with a max-attempts cap

The subtler fix is not hitting 429 in the first place: watch X-RateLimit-Remaining, batch where the API allows it (fetch 100 tickets per page instead of 100 separate calls), and cache anything that doesn't change every minute.

The per-minute limits by plan

This is the number people most want and most often get wrong, because Freshdesk has been migrating from an hourly model to a per-minute model in batches. Per Freshworks' rate-limit documentation, the current per-minute ceilings look like this:

PlanOverall limit (req/min)Ticket createTickets list
Trial50
Growth2008020
Pro400160100
Enterprise700280200

Two things trip people up here. First, the limit is account-wide, not per-key — every app, agent action, and integration on the account draws from the same pool. Add a noisy third-party sync and your own script starts seeing 429s it never saw before. Second, there are per-endpoint sub-limits underneath the overall number: on Growth you can only list tickets 20 times a minute even though your overall budget is 200, so a paginating export can starve on one endpoint while the account budget looks healthy. Always confirm the live numbers against your own plan, since the rollout and exact figures shift.

The honest limits — and where an AI layer picks up

Credit where it's due: Freshdesk's API is well-behaved. The status codes are documented, the error bodies are machine-parseable (a 400 returns an errors array naming the exact field and a code like missing_field), and the rate-limit headers hand you everything you need to stay under the ceiling. For a deterministic integration, that's about as good as REST APIs get.

But notice what the API doesn't solve. It gives you the plumbing — read a ticket, write a reply, list contacts — and leaves the reasoning entirely to you. It won't decide whether a reply is correct, won't understand what the customer is actually asking, and won't know which of your internal systems holds the answer. Every 429-aware retry loop and pagination cursor you write is undifferentiated glue that has nothing to do with your actual support problem.

This is the seam where an AI agent layer fits — and it's worth understanding the category of AI agents for customer service before reaching for one. Macha is one such layer: it runs on top of the Freshdesk you already use as a native connector — it does not replace your help desk or its API. You connect Macha to Freshdesk with your subdomain and API key, and it handles the same calls you'd otherwise script by hand — auth, pagination, and rate-limit-aware backoff — while reading and writing the same tickets. On top of that plumbing it does the reasoning the raw API can't: drafting grounded replies, triaging by intent, and reaching into your own systems through a custom tool that wraps a REST API into something an agent can call. If you're weighing scripts against a platform, our guide on how to automate Freshdesk with AI walks the tradeoff. (Macha's connector is for Freshdesk specifically — not Freshchat, Freshservice, or Freshcaller. And credits are consumed per AI action, not per resolution — see the pricing breakdown.)

The clean division of labour: let Freshdesk's API stay the system of record, and layer an agent on top to do the part the status codes and rate-limit headers can't — actually understanding and answering the ticket.

FAQ

What causes a 401 invalid_credentials error in Freshdesk? A 401 means the Authorization header is missing or incorrect — a wrong or mistyped API key, a key belonging to a different agent, or a Base64-encoding mistake. It does not mean your endpoint or account is wrong. If the same credentials log into the Freshdesk UI but fail on the API, suspect a header-format or encoding problem rather than a bad key.

What is the difference between a 401 and a 403? A 401 is an authentication failure — Freshdesk can't verify who you are. A 403 is authorization — it verified you, but this identity isn't allowed to perform this action, often because the agent lacks an admin role or an account limit has been reached.

What are the Freshdesk API rate limits? Limits are per minute and account-wide: roughly 50 req/min on Trial, 200 on Growth, 400 on Pro, and 700 on Enterprise, with tighter per-endpoint sub-limits underneath (for example, Growth allows only 20 ticket-list calls per minute). Freshdesk has been migrating from hourly to per-minute limits in batches, so confirm the exact figures against your own plan.

How do I handle a 429 Too Many Requests error? Catch the 429, read the Retry-After response header for the exact number of seconds to wait, sleep for that long plus a little random jitter, and cap your retries with exponential backoff. Better still, watch the X-RateLimit-Remaining header on every response and slow down before you hit zero.

Can I add AI to Freshdesk without replacing it or writing rate-limit code? Yes. An AI agent layer like Macha connects to Freshdesk as a native connector and runs on top of your existing help desk — it doesn't replace it. It handles the API plumbing (auth, pagination, backoff) for you, while Freshdesk stays the system of record for your tickets.

Ready to skip the retry loops and let agents work your Freshdesk tickets directly? Start a free trial of Macha and connect it to your Freshdesk in minutes.

Macha

About Macha

Macha is an AI agent platform that works on top of the help desk you already use — Zendesk, Freshdesk, Gorgias, or Front — and connects to the rest of your stack, even your own internal systems. Its AI agents resolve tickets and automate entire workflows end to end, all set up in plain English, no code. Learn more about Macha →

Zendesk
5.0 on Zendesk Marketplace

Loved by support teams worldwide

See what support teams are saying about Macha AI.

The application seems excellent to me! We are still testing, and we need support for some details and they were extremely efficient too!

Daniela Costa

Daniela Costa

Head of Support, Seabra

Macha has been a great addition to our support toolkit. It generates clear, well-organized responses that fit naturally into our workflow. One feature we particularly appreciate is its ability to automatically reply in the same language as the ticket.

Marius F

Marius F

Support Head, Zentana

We've been using Macha for a little while now and it's been really great addition so far! It's powerful, convenient, and makes getting work done a lot easier for our agents.

Alexander Wedén

Alexander Wedén

Head of Support

Support team is very helpful and responsive. Really enjoy how lightweight this is within Zendesk itself vs other more intrusive tools.

Cathleen Wright

Cathleen Wright

Zendesk Admin, Cortex IO

So far it's pretty good! Our queries are a little nuanced, so we can't always use it, but it's got enough utility for us. It can even incorporate our bilingual country with greetings in a second language.

Jae Oliver

Jae Oliver

Head of Support, Wise

Really enjoying using Macha, it has made a noticeable difference to our support team in a short amount of time. I really like the ticket summary feature, saves us a lot of time.

Harry Jackson

Harry Jackson

Head of Support, Crumb

Macha AI is a great addition to my workspace! It's powerful, convenient, and it really makes productivity so much easier for our agents!

Dave G

Dave G

Head of Support, Cyber Power Systems

Very impressed! AI integration for Zendesk has certainly come a long way and Macha seems to set the standard for now. This will for sure save lot of time in our support team.

Pauli Juel

Pauli Juel

Head of CS, Dokument24

Macha has been working great for us so far! The auto-responses are accurate and our resolution time has dropped significantly.

Lana T

Lana T

Zendesk Admin, Swotzy

Macha AI is a great addition. The knowledge base feature means our agents always have the right answers at their fingertips.

Mischa Wolf

Mischa Wolf

Head of Support, Topi

We're enjoying this integration so far. It's made our support team more efficient and our customers get faster responses.

Paula G

Paula G

Head of Customer Support, Xly Studio

The team enjoys using it. It saves considerable time on common questions and the integration options are excellent.

Kilian Leister

Kilian Leister

Support Head, Didriksons

Ready to supercharge your team with AI?

Get started in minutes. Connect your tools, configure your agents, and let AI handle the rest.

500 free credits · no time limit, no credit card