Connect Freshdesk to Fondoo
Freshdesk in Fondoo: what your AI agent can do with it, what to set up first, the permissions it needs and its limits.
Use a Freshdesk agent API key (Profile settings in your support portal, shown below the change-password section; the agent role decides what the key may do, so pick an agent allowed to view, create, reply to and update tickets) and your helpdesk subdomain, the part before .freshdesk.com. API rate limits are plan-based and every request counts, even invalid ones. Freshdesk webhooks come from Automation rules (Growth plan or higher) and Freshdesk does NOT sign them: Fondoo can only check a shared secret header, so set webhookSecret to a long random token without spaces, add it in the rule as the custom header X-Fondoo-Webhook-Secret, and leave the rule's Requires authentication toggle off.
Official documentation: https://developers.freshdesk.com/api/
Use add_connection_key without fields for a signed, one-use secure paste page. Then call test_connection and inspect confirmed versus unknown permissions. Direct tool credentials carry a chat-log warning. list_connections never returns credentials.
Auth: api_key (HTTP Basic <api key>:X; credential fields subdomain, apiKey (secret), webhookSecret (secret)). Category: support. Required provider scopes: none (the agent role behind the key decides what it may do).
Capabilities are discoverable with list_connector_manifests; invoke them through connector_action. Writes retain shared Fondoo scopes, approvals, dry runs, audit, events and metering. Use rotate_connection_key before expiry and delete_connection to remove stored credentials; revoke upstream credentials separately.
What Fondoo does with Freshdesk
Freshdesk is a helpdesk provider for the M15 support switch: set_provider({siteId, capability:'support', provider:'freshdesk'}) routes the shared support ticket operations to this connection. A Fondoo "ticket" is a Freshdesk ticket and its ID is the numeric ticket ID.
Normalized capabilities (all through connector_action or the support operations):
tickets.list(read): without a status,GET /tickets?updated_since=<30 days ago>&order_by=updated_at&order_type=desc(Freshdesk would otherwise return only tickets created in the last 30 days), up to 300 pages;cursoris the page number andlimit1..100. With a status, the Filter Tickets search ("status:<n>") is used: fixed 30 per page, at most 10 pages.tickets.get(read):GET /tickets/{id}?include=requester;descriptionis the plain text version,assignee_idisresponder_id.tickets.comments(read): the ticket description as the first customer message (<id>:description), then conversations (GET /tickets/{id}/conversations, 30 per page, at most 10 pages per call with a resume cursor).privateconversations arepublic:false; incoming ones arecustomer, othersagent.tickets.create(write):POST /ticketswith status Open (2), priority default normal, optional tags. The comment is HTML-escaped into the description.tickets.update(write): public replyPOST /tickets/{id}/reply, private notePOST /tickets/{id}/noteswithprivate:true(both HTML-escaped), then onePUT /tickets/{id}for status, priority, tags (replaces the full set) andassignee_id(agent ID, sent asresponder_id). Reply and note come first.
Status mapping: Freshdesk 2 → open, 3 → pending, 4 → solved, 5 → closed, 6 and 7 (waiting on customer / third party) → pending, custom statuses → open. Writes: new/open → 2, pending → 3, solved → 4, closed → 5. Priority: 1 low, 2 normal, 3 high, 4 urgent.
Webhooks
Call get_helpdesk_webhook({connectionId}) for the URL (/webhooks/helpdesk/<connectionId>). Freshdesk webhooks come from Automation rules (Growth plan or higher) and are not signed. Fondoo therefore checks a shared secret header: set webhookSecret to a long random token (at least 24 characters from A-Z a-z 0-9 . _ ~ -), add the custom header X-Fondoo-Webhook-Secret with that value in the rule's webhook action, leave "Requires authentication" off, and send a JSON body containing event (ticket_created or ticket_updated) and ticket_id. The secret is compared in constant time. This is weaker than an HMAC: anyone who learns the header value can post events, and there is no replay protection, so treat the secret like a password and rotate it with rotate_connection_key. Only the ticket ID is read; content is re-read through the API.
Human-only topics
Complaints, refunds and legal requests stay human-only: Fondoo classifies new tickets with the site's protected-category rules, raises complaint.opened or refund.requested, alerts a human and requires owner approval for agent replies. This connector has no refund, payment or delete capability.
API endpoints used
- Tickets list / view / create / update: https://developers.freshdesk.com/api/#tickets
- Filter tickets (
/search/tickets?query="status:2", 30 per page,pageup to 10): https://developers.freshdesk.com/api/#filter_tickets - Conversations, reply and notes: https://developers.freshdesk.com/api/#conversations
- Rate limits: https://developers.freshdesk.com/api/#ratelimit
- Automation webhooks (unsigned): https://support.freshdesk.com/support/solutions/articles/132589
Limits and uncertainties
- Rate limit: per account and plan (a 3,000 calls/hour table on current plans, an older 100/min on Growth); invalid requests and
include=embeds consume credits too. Fondoo budgets 15 executes per minute;X-RateLimit-*andRetry-Afterstay authoritative. - Confirmed from the API reference while writing this guide: Filter Tickets returns 30 results per page with
pagenot exceeding 10 and the query URL-encoded in double quotes; List Tickets returns only the last 30 days of created tickets unlessupdated_sinceis set, with a 300 page maximum. The reply and note request bodies could not be read in the fetched portion of the reference; the shapes used (body, andprivate:truefor notes) follow Freshdesk's documented examples and should be rechecked. - Uncertain: some plans reject
include=requesteror restrict the Filter Tickets API; the call then fails with a provider error. - Uncertain: Freshdesk custom statuses are treated as open.
- Search results can lag a few minutes behind updates, so a freshly changed ticket can be missing from a status-filtered list.
- Webhook authenticity relies on a shared secret, not a signature (see above).
