> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rippit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Freshdesk

> Technical reference for the Rippit Freshdesk data integration: API key authorization, API endpoints, what a ticket becomes in Rippit, attachments, and sync behavior.

A read-only API key integration that syncs Freshdesk tickets, conversations, contacts, and satisfaction ratings into Rippit on a schedule. For what applies to every integration, see [how data integrations work](https://docs.rippit.com/plg/data-integrations.md). For the security model, see [Data integration security](https://docs.rippit.com/security/data-integrations.md).

## Connection summary

| | |
| - | - |
| Authorization | A Freshdesk API key, sent as HTTP Basic authentication with the key as the username |
| Scope parameter | None. The key acts as the agent it belongs to |
| Key requirement | The key must belong to an Administrator or Account Administrator with **Grant API key access** turned on |
| Writes to Freshdesk | None. Every call is a `GET` |
| Credentials shared with Rippit | The API key. Rippit stores it and uses it for every sync |
| Credential check | The subdomain and key are tested against Freshdesk before the connection is created. Rejected credentials create no connection, and Rippit does not keep them |
| Connection identity | Your Freshdesk subdomain. One connection per subdomain |
| Required Rippit role | Workspace admin |
| API base | `https://<subdomain>.freshdesk.com/api/v2` |
| API version | `v2`, in the path |
| Sync method | Scheduled polling |
| Attachments | Downloaded and stored by Rippit, including images inline in message bodies |
| Maximum historical backfill | 90 days. The default is 7 |
| Field selection limit | 150 columns |

## Before you connect

Rippit asks for two values. The subdomain is the part of your Freshdesk URL before `.freshdesk.com`: `acme` in `acme.freshdesk.com`. You can paste the whole URL and Rippit extracts the subdomain.

The API key is in Freshdesk under your profile picture, then **Profile settings**, then **View API key**. An admin key is required because the credential check reads `/agents`, which Freshdesk restricts to administrators. Because the key acts as its agent, Rippit can read everything that admin can read.

## Data handling

| Question | Answer |
| - | - |
| Is ticket content ingested, or only metadata? | Full content: the ticket description, its replies and notes (up to 100 per ticket), contacts, agents, groups, and satisfaction ratings. Exception: tickets with a source of Phone sync the same content except replies and notes |
| Are private notes ingested? | Yes. Private notes are stored and marked as not public |
| Are attachments stored? | Yes. File attachments and inline images are downloaded and stored rather than linked |
| Can Rippit modify Freshdesk? | No. No write code path exists |
| Is data used to train models? | No. Rippit does not train any AI models. Your data is used for inference only |

### What a ticket becomes in Rippit

Each Freshdesk ticket becomes one conversation in Rippit.

| Rippit record | Content |
| - | - |
| Subject | The ticket subject |
| Agent | The ticket's assigned agent (`responder_id`) |
| Start and end | The ticket's created time and its last updated time |
| Resolved time | The ticket's `resolved_at` time, when it has one |
| Default selected fields | Subject, status, platform (the ticket's source channel, such as Email, Portal, Phone, or Chat), group name, tags, last assignee, commenters, first commenter, and last commenter |
| First comment | The ticket description. It is attributed to the requester, or to the assigned agent when the ticket is an outbound email |
| Conversation comments | Replies and notes, up to 100 per ticket, each attributed to its author. Not synced for tickets whose source is Phone. Freshdesk automation replies that have no author are attributed to a bot |
| Satisfaction ratings | Survey ratings, with any written feedback added as a comment |
| People | Contacts, with name, email, and phone, and agents, with name, email, phone, and job title |

Status and platform labels are read from your account's ticket fields, so renamed or custom statuses keep their names.

## API endpoints

### Authentication

| Purpose | Endpoint | Method |
| - | - | - |
| Subdomain check, which fails with `404` if the subdomain is not a Freshdesk account | `/settings/helpdesk` | GET |
| Credential check, admin access | `/agents` | GET |

### Tickets, conversations, and people

| Object | Endpoint | Method |
| - | - | - |
| Tickets changed since the last sync | `/tickets?order_by=updated_at&order_type=asc&per_page=100&updated_since=<time>` | GET |
| A single ticket, with resolution stats | `/tickets/<id>?include=stats` | GET |
| A single ticket, to re-sync it or refresh an attachment URL | `/tickets/<id>` | GET |
| A ticket's replies and notes | `/tickets/<id>/conversations?per_page=100` | GET |
| Contacts changed since the last sync | `/contacts?per_page=100&_updated_since=<time>` | GET |
| A single contact, by ID | `/contacts/<id>` | GET |
| All agents | `/agents?per_page=100` | GET |
| A single agent, by ID | `/agents/<id>` | GET |
| Satisfaction ratings created since the last sync | `/surveys/satisfaction_ratings?per_page=100&created_since=<time>` | GET |
| A single conversation, to refresh an attachment URL | `/conversations/<id>` | GET |
| A ticket's satisfaction ratings | `/tickets/<id>/satisfaction_ratings` | GET |
| Groups | `/groups?per_page=100` | GET |
| Products | `/products?per_page=100` | GET |
| Ticket field definitions, for status and source labels | `/ticket_fields` | GET |
| A sample ticket and contact, for field discovery | `/tickets?include=stats` and `/contacts` | GET |
| Attachments | The `attachment_url` on each attachment, as returned by Freshdesk | GET |

The list endpoints (tickets, contacts, agents, groups, products, and satisfaction ratings) page with the `Link` response header, and Rippit follows the `next` link until it is absent. A ticket's conversations are fetched as one page of up to 100.

Conversations are not a list endpoint. Each ticket returned by the tickets list is refetched by ID, and its conversations are fetched separately. Tickets whose source is Phone are refetched, but their conversations are not requested.

Freshdesk attachment URLs expire within minutes, so before downloading each file Rippit refetches its ticket (`/tickets/<id>`) or conversation (`/conversations/<id>`) by ID to get a fresh URL.

## Sync behavior

| | |
| - | - |
| Ticket discovery | Filtered on `updated_since`, oldest first, link-header pagination |
| Ticket detail and conversations | Refetched per ticket, one request each. Conversations are one page of up to 100 |
| Contacts | Filtered on `_updated_since`. Contacts missing from tickets synced in the last 7 days are fetched by ID once a day |
| Agents | Full list on every sync |
| Groups and products | Full list once a day |
| Satisfaction ratings | Filtered on `created_since` |
| Update handling | An updated ticket is listed again, and the ticket and its conversations are refetched |
| Resumption | High water mark on ticket `updated_at`. Changed tickets only, no full rescan |

## Rate limiting

Freshdesk limits API calls per minute for each account. Rippit reads `X-RateLimit-Total` and `X-RateLimit-Remaining` on each response and slows down as the remaining budget runs low. Because conversations take one request per ticket, a large backfill spends most of its budget there, which is why the default backfill is 7 days.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.