How to Export Data from Freshdesk: Methods, API Limits & Mapping
Learn how to export Freshdesk tickets, contacts, and KB articles using UI exports, Account Export, and the REST API—with exact rate limits and gotchas.
Freshdesk gives you three ways to get data out: a UI-level CSV export that drops conversations, an Account Export that dumps everything into XML (or JSON via the API), and a REST API with plan-based rate limits and per-endpoint sub-limits that will break your scripts if you don't account for them. None of them is a one-click "export everything in a clean, import-ready format" button.
The standard UI ticket export does not include ticket conversations, private notes, or archived tickets. To extract complete relational data—including threaded replies, inline images, and full conversation histories—you must either parse a massive Account Export file or build a custom script against the Freshdesk REST API. (support.freshdesk.com)
This guide covers each method step by step—what data it actually returns, what it silently omits, and the exact rate limits and pagination ceilings you'll hit when extracting tickets, contacts, companies, and knowledge base articles programmatically.
If you're exporting as part of a migration to another helpdesk, these destination-specific guides cover field mapping: Freshdesk to Zendesk, Freshdesk to Help Scout, Freshdesk to Intercom, or Freshdesk to Front.
What Data Can You Actually Export from Freshdesk?
Before choosing a method, know what Freshdesk considers exportable and what requires workarounds.
| Data Type | UI Export (CSV) | Account Export (XML/JSON) | REST API (JSON) |
|---|---|---|---|
| Tickets (metadata) | ✅ Filtered fields | ✅ All | ✅ All |
| Ticket conversations | ❌ | ✅ | ✅ (separate endpoint) |
| Archived tickets | ❌ | ✅ | ✅ (separate endpoint) |
| Attachments (files) | ❌ | ❌ (references only) | ✅ (download via URL) |
| Contacts | ✅ CSV | ✅ | ✅ |
| Companies | ✅ CSV | ✅ | ✅ |
| Knowledge Base articles | ✅ List/properties only | ✅ (with HTML body) | ✅ (JSON with HTML body) |
| KB inline images | ❌ | ❌ | Must download separately |
| Tags | ❌ (no dedicated export) | ✅ (embedded in ticket data) | ✅ (per-ticket field) |
| Canned responses | ❌ | ✅ | ✅ |
| Satisfaction ratings | ❌ | ✅ | ✅ |
| Time entries | ❌ | ❌ | ✅ |
The short version: the UI export gives you a spreadsheet snapshot. The Account Export gives you a raw dump. The API gives you full relational data—but you pay for it in engineering time and rate-limit management.
For a deeper look at why flat CSV exports lose relational context during migrations, see Using CSVs for SaaS Data Migrations: Pros and Cons.
Method 1: Native UI Ticket Export (Quick CSVs)
Best for: One-off reports, quick snapshots, filtered ticket lists.
Not for: Full data extraction, migrations, compliance backups.
Step-by-step
- Navigate to the Tickets tab and select the All Tickets view.
- Apply filters (created time, agent, group, status, type).
- Click Export in the top-right corner.
- Choose CSV or Excel format.
- Select the ticket fields to include. Expand Show multiline text fields if you need the Description field.
- Click Export. Freshdesk emails you a download link.
One easy-to-miss detail: Freshdesk recommends keeping the Created time filter on the list page broader than the export window—ideally "Any time" on the list page, with the real date range set inside the export panel. (support.freshdesk.com)
This export does NOT include ticket conversations, private notes, or archived tickets. You need either an Account Export or the REST API to get conversations. (support.freshdesk.com)
What you get
- Ticket metadata: ID, subject, status, priority, source, group, agent, tags, custom fields, created/updated timestamps.
- Description field is available only if you expand the multiline fields section.
- You can filter by created-time range, but the list page time frame must be wider than or equal to the export window.
What you don't get
- Full conversation threads (replies, notes, forwards).
- Attachments.
- Archived tickets (closed tickets older than ~120 days).
- Satisfaction ratings tied to tickets.
If the export button is missing, check permissions before you troubleshoot anything else. Freshdesk role settings can hide export access—Admin or Supervisor access is the normal prerequisite. (support.freshdesk.com)
Contacts and companies
Contacts and companies have their own CSV export. Go to Contacts (or Companies) → Export → select fields → Export. Custom fields are included. Download links appear in Admin > Account Exports.
Freshdesk also exposes dedicated asynchronous export APIs for contacts and companies. These run as background jobs, return an export ID, and provide a CSV download URL. Only one contact export and one company export can run at a time per account, and the resulting file URL stays available for 15 days. (developers.freshdesk.com)
Method 2: Full Account Export (Backup, Compliance & Full History)
Best for: Full data dumps, regulatory compliance, backup before platform changes.
Not for: Targeted extraction, migration-ready output, automated workflows.
UI-based export
- Log in as an Account Administrator.
- Navigate to Admin → Account → Account Details → Export Data.
- Click Export.
- Freshdesk processes the export and emails a download link to the account admin's registered email address.
- Download the
.zipfile and extract it.
The ZIP file contains separate XML files for:
- Tickets — including full conversation threads, notes, and archived tickets
- Contacts/Users
- Companies
- Groups
- Solutions (Knowledge Base articles with HTML body content)
- Forums (if applicable)
The limitations
- Link Expiry: The download link expires in 48 hours. Miss it, and you have to run the export again.
- XML Format: Freshdesk's API v2 deprecated XML support years ago—only JSON is accepted for imports. If your goal is to migrate this data, you need to parse the XML files (some can be hundreds of MB for large accounts), transform the data, map fields to the target system's schema, and handle attachments separately. The Account Export contains attachment references, not the actual files.
- No Incremental Sync: You cannot export "just the tickets updated since yesterday." The UI-based path is an all-or-nothing export.
API-based Account Export (recommended for automation)
Freshdesk also offers a programmatic Account Export API (POST /api/v2/account/export) that lets you specify a date range, choose specific resources, and request JSON output instead of XML. You can include sub-resources like notes, attachments metadata, and ticket states. Track progress via the Jobs API. (developers.freshdesk.com)
curl -v -u YOUR_API_KEY:X \
-H "Content-Type: application/json" \
-X POST \
-d '{
"date_range": {
"start_date": "2020-01-01T00:00:00Z",
"end_date": "2026-04-14T00:00:00Z"
},
"resources": [
{"name": "tickets", "include": ["notes", "attachments", "ticket_states"]},
{"name": "archive_tickets", "include": ["notes", "attachments"]},
{"name": "contacts"},
{"name": "companies", "include": ["company_domains"]},
{"name": "solutions"}
],
"output_format": "json"
}' \
'https://yourdomain.freshdesk.com/api/v2/account/export'This returns a job_id. Poll /api/v2/jobs/{job_id} until the status is complete, then download the file.
The resource list is broad: tickets, archive_tickets, contacts, companies, groups, forums, canned responses, surveys, and solutions are all supported. Ticket resources can include notes, attachments, ticket states, and requester data. (developers.freshdesk.com)
Use the API-based account export when you need archived tickets or article bodies. It supports date ranges, JSON output, and specific resource selection—making it far easier to operationalize than the UI path that relies on email delivery.
The trade-off is structure, not coverage. Account export gives you completeness, but the output is still an extraction bundle, not a ready-made import package. Expect parsing work, attachment handling, and object mapping before the data is usable in another system.
Method 3: REST API Extraction (Migrations & Syncs)
Best for: Targeted data extraction, migrations, continuous syncs, building import-ready datasets.
Requires: Developer resources, rate-limit management, pagination handling.
The Freshdesk REST API v2 is the only path that gives you full relational data—tickets with their conversations, contacts with their custom fields, and KB articles with their folder hierarchy—in a structured, programmable format. (developers.freshdesk.com)
Key endpoints for data extraction
| Data | Endpoint | Notes |
|---|---|---|
| List tickets | GET /api/v2/tickets |
Returns last 30 days by default. Use updated_since for older tickets. Max 300 pages. |
| View single ticket | GET /api/v2/tickets/{id} |
?include=conversations,requester,stats adds context but costs extra API credits. |
| Ticket conversations | GET /api/v2/tickets/{id}/conversations |
Paginated. Returns replies, notes, forwards. |
| Archived tickets | GET /api/v2/tickets/archived/{id} |
Must know the ticket ID. No bulk list endpoint—use Account Export API for discovery. |
| Filter tickets | GET /api/v2/search/tickets?query= |
30 results per page. Max 10 pages (300 tickets). Archived tickets excluded. |
| Contacts | GET /api/v2/contacts |
Paginated, filterable. |
| Companies | GET /api/v2/companies |
Paginated. |
| KB categories | GET /api/v2/solutions/categories |
Top-level hierarchy. |
| KB folders | GET /api/v2/solutions/categories/{id}/folders |
Second-level hierarchy. |
| KB articles | GET /api/v2/solutions/folders/{id}/articles |
Returns HTML body content. |
Pagination rules
- Default page size: 30 objects.
- Maximum page size: 100 objects (set via
per_pageparameter). - Maximum pages for List All Tickets: 300 (ceiling: 30,000 tickets via this endpoint alone).
- Maximum pages for Filter Tickets: 10 (ceiling: 300 tickets per query).
- Deep pagination (pages over 500) causes severe performance degradation per Freshdesk's docs.
- The
linkheader in the response contains the next page URL. When absent, you've reached the end.
For accounts with more than 30,000 tickets, the List All Tickets endpoint won't return everything. Use updated_since with time-windowed queries to incrementally pull all tickets, or use the Account Export API for the initial bulk pull and the REST API for delta syncs.
Extracting full ticket threads
A common mistake is assuming the ticket object contains conversations. It does not—not by default. You must:
- List tickets via
GET /api/v2/tickets?updated_since=...&per_page=100 - For each ticket, fetch conversations via
GET /api/v2/tickets/{id}/conversations - Download attachments by following the
attachment_urlin each conversation object
On the View Ticket endpoint, include=conversations returns only up to 10 conversations. If a ticket has more than that, you must use the dedicated List All Conversations endpoint. (developers.freshdesk.com)
This means extracting 5,000 tickets with conversations requires at minimum 5,050 API calls (50 for listing + 5,000 for conversations)—and likely more if conversations span multiple pages.
Custom field mapping
Before you pull a single ticket, query the /api/v2/ticket_fields endpoint. Freshdesk returns custom fields as key-value pairs where the key is an internal system name (e.g., cf_browser_version). If your script doesn't dynamically map these internal names to your target system's schema, custom field data will be silently lost during extraction.
API domain requirement
Use the Freshdesk domain (e.g., yourdomain.freshdesk.com), not a custom CNAME. Freshdesk's API docs explicitly state that v2 works through Freshdesk domains only. (developers.freshdesk.com)
Freshdesk API Rate Limits by Plan
This is where most DIY extraction scripts break. Freshdesk enforces account-wide, per-minute rate limits that vary by plan. But the account-wide limit is not the binding constraint—the per-endpoint sub-limits are.
| Plan | Account Limit (per min) | Tickets List | Ticket Create | Ticket Update | Contacts List |
|---|---|---|---|---|---|
| Free | 0 | 0 | 0 | 0 | 0 |
| Growth | 200 | 20 | 80 | 80 | 20 |
| Pro | 400 | 100 | 160 | 160 | 100 |
| Enterprise | 700 | 200 | 280 | 280 | 200 |
| Trial | 50 | — | — | — | — |
Source: Freshdesk Developer Portal
What this means in practice
On the Growth plan, your account can make 200 API calls per minute total. But the Tickets List endpoint is sub-limited to 20 calls per minute. At 100 tickets per page, that's 2,000 ticket headers per minute—but you still need to fetch each ticket's conversations individually, and those calls draw from the same 200/min pool.
A back-of-napkin calculation for extracting 10,000 tickets with conversations on the Growth plan:
- 100 calls to list tickets (100 pages × 100 per page) at 20/min = 5 minutes
- 10,000 calls for conversations at ~200/min = 50 minutes
- Total: ~55 minutes assuming zero errors and perfect throttling
On Enterprise, the same extraction drops to roughly 18 minutes.
Trial accounts are capped at just 50 API requests per minute. This makes them unsuitable for testing large data exports. Even invalid API requests count toward your rate limit—if your script sends malformed requests, you burn through your quota without getting data back. (developers.freshdesk.com)
Handling 429 errors
When you exceed the limit, Freshdesk returns a 429 Too Many Requests response with a Retry-After header. Your extraction script must:
- Check
X-RateLimit-Remainingin every response header. - Implement exponential backoff on 429 responses.
- Queue requests and respect the
Retry-Aftervalue. - Track per-endpoint sub-limits separately—the global remaining count can be misleading.
Freshdesk shares the API budget across all agents, apps, and integrations on the account. If you have custom Freshdesk apps or marketplace integrations running, they consume the same pool. (developers.freshdesk.com)
How to Export Freshdesk Knowledge Base Articles
Freshdesk calls its knowledge base "Solutions." There is no dedicated bulk export button for article content in the UI.
Option A: Article list export (metadata only)
From the Solutions page, you can select articles and click Export to get a CSV of article properties (title, status, folder, category, views, upvotes). This does not include the article body content. (support.freshdesk.com)
Option B: Account Export (content included)
The full Account Export includes a Solutions file containing article HTML bodies, category/folder hierarchy, and metadata. This is the only native non-API path to bulk-export article content.
Option C: Solutions API (recommended for migrations)
The Solutions API exposes a clean three-level hierarchy:
Categories → Folders → Articles
Walk the tree programmatically:
# 1. List categories
GET /api/v2/solutions/categories
# 2. For each category, list folders
GET /api/v2/solutions/categories/{category_id}/folders
# 3. For each folder, list articles
GET /api/v2/solutions/folders/{folder_id}/articles
# 4. View individual article (includes description HTML)
GET /api/v2/solutions/articles/{article_id}The article body is returned as an HTML string in the description field. Articles also include description_text, status, tags, hits, thumbs, and seo_data. Translated folder and article endpoints exist for multilingual knowledge bases. (developers.freshdesk.com)
The image problem
Inline images in KB articles are stored as HTML <img> tags pointing to Freshdesk's CDN. If you move the raw HTML to a new system, those image links will break when your Freshdesk account is deactivated. Your extraction script must download the image binary, upload it to the target system, and rewrite the HTML src attribute.
The same applies to ticket conversations—<img> tags in ticket bodies reference Freshdesk-hosted URLs that won't survive a platform change.
Freshdesk Data Mapping: What to Capture Before You Leave
A good export is not just complete—it's mappable. Before you leave Freshdesk, make sure your extract preserves these fields at minimum:
| Freshdesk Object | Fields to Keep | Why It Matters |
|---|---|---|
| Ticket | id, subject, status, priority, created_at, updated_at, requester/company refs, tags, custom_fields | Rebuild ownership, status history, and lookups |
| Initial ticket body | description, description_text | Preserve both HTML and plain text |
| Conversation | id, body, body_text, private, source, user_id, created_at | Keep replies, private notes, and channel/source context |
| Attachment | parent ticket/conversation id, name, size, attachment URL | Recover binaries and relink them |
| Contact / Company | ids, emails, phones, domains, custom fields, company links | Identity resolution and relationship rebuilding |
| KB Article | category_id, folder_id, hierarchy, language, description, description_text, status, tags, seo_data | Recreate article structure and metadata |
Those fields align with Freshdesk's ticket, conversation, contact/company, and Solutions objects. If you flatten them too early—say, by exporting everything to a single CSV—you make the destination mapping harder than it needs to be. (developers.freshdesk.com)
Why DIY Freshdesk Exports Fail at Scale
Teams often assume they can write a quick Python script to pull Freshdesk data over a weekend. At scale, this approach almost always fails. The pattern is consistent:
-
The script works on 500 tickets in test, then dies on 50,000 in production. Growth plan sub-limits (20 calls/min for Tickets List) turn what looks like a 10-minute script into a multi-hour crawl with constant 429 retries.
-
Conversations are extracted but inline images are missing. Ticket conversations contain
<img>tags pointing to Freshdesk-hosted URLs. If you don't download those images and re-host them, they break the moment you deactivate the Freshdesk account. -
Archived tickets are silently skipped. The standard
GET /api/v2/ticketsendpoint does not return archived tickets. The Filter Tickets endpoint explicitly excludes them. You need the separate/api/v2/tickets/archived/{id}endpoint—but there's no bulk list for archived tickets via the standard API. The Account Export API is the only reliable way to discover all archived ticket IDs. -
The Account Export XML is unusable without transformation. Teams download the XML dump, realize it's a monolithic file with no clear field mapping to their target system, and end up rebuilding the parser multiple times.
-
Attachments require a separate download pipeline. Neither the UI export nor the Account Export includes the actual attachment binary files. Only the API gives you downloadable URLs—and downloading thousands of attachments is its own rate-limiting and storage challenge. Freshdesk requires authentication for every binary request, and a single large attachment download can block a synchronous script.
-
AI-generated scripts miss the edge cases. If you're using generative AI in SaaS data migration to write extraction scripts, LLMs rarely account for Freshdesk's per-endpoint sub-limits, the undocumented behavior of archived tickets, or the 10-conversation cap on
include=conversations. They write standard pagination loops that fail in production. For more on this pattern, see The Data Migration Risk Model: Why DIY AI Scripts Fail.
Validation checklist
A few checks catch most export failures before they become migration failures:
- Compare ticket counts by date range, not just total tickets.
- Verify that archived tickets are present when they should be.
- Sample tickets with more than 10 replies and confirm the full thread is present.
- Count attachments at both ticket and conversation level.
- Validate private notes separately from public replies.
- For KB exports, verify language variants, folder hierarchy, and restricted-content visibility.
When to Use Which Method
| Scenario | Recommended Method |
|---|---|
| Quick report for management | UI CSV Export |
| Full backup before canceling Freshdesk | Account Export API (JSON) |
| Migrating to another helpdesk | REST API extraction + attachment download |
| Real-time sync with CRM or data warehouse | REST API with webhooks + reconciliation |
| Audit/compliance archive | Account Export API with date range |
The ClonePartner Approach
If you're exporting Freshdesk data as part of a migration—not just a backup—the extraction is only half the problem. The other half is mapping Freshdesk's data model to your target system, preserving conversation threading, re-hosting attachments and inline images, and maintaining relational integrity between tickets, contacts, and companies.
We handle Freshdesk's API constraints (including the Growth plan's 20-call/min Tickets List sub-limit), download and re-host every attachment and inline image, preserve full conversation threads with correct timestamps and agent attribution, and map KB articles with their category hierarchy intact.
If your destination is already chosen, these guides cover the next step:
Frequently Asked Questions
- Does the Freshdesk CSV export include ticket conversations?
- No. The native UI ticket export only provides ticket metadata like subject, status, priority, and custom fields. It does not include agent replies, private notes, attachments, or archived tickets. You need either an Account Export or the REST API to get full conversation threads.
- What are the Freshdesk API rate limits per plan?
- Growth: 200 calls/min (Tickets List sub-limited to 20/min). Pro: 400 calls/min (Tickets List: 100/min). Enterprise: 700 calls/min (Tickets List: 200/min). Trial accounts are capped at 50 calls/min. These are account-wide limits shared across all agents, apps, and integrations.
- Can I export archived tickets from Freshdesk via API?
- The standard List All Tickets endpoint and Filter Tickets endpoint both exclude archived tickets. You must use the dedicated /api/v2/tickets/archived/{id} endpoint for individual archived tickets, or use the Account Export API with the archive_tickets resource to discover and export them in bulk.
- How do I export Freshdesk knowledge base articles with content?
- The native KB export in the UI only gives you article metadata (title, status, folder), not the article body. Use the Account Export for XML with article HTML, or use the Solutions API to walk the Categories → Folders → Articles hierarchy and extract article content as JSON.
- Can I test a large Freshdesk export on a trial account?
- You can, but it's a poor performance benchmark. Trial accounts are capped at 50 API calls per minute, so large exports hit 429 rate-limit errors much faster than paid plans. Even invalid requests count toward the limit.
