How to Export Data from Zoho Desk: Methods, Limits & API Guide
Learn how to export data from Zoho Desk using native CSV, Data Backup, and the REST API — with record limits, attachment handling, and export gaps explained.
Planning a migration?
Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.
Schedule a free call- 1,500+ migrations completed
- Zero downtime guaranteed
- Transparent, fixed pricing
- Project success responsibility
- Post-migration support included
How to Export Data from Zoho Desk: Methods, Limits & API Guide
TL;DR — Zoho Desk Data Export
You can export most operational data from Zoho Desk, but no single native tool covers everything. The UI export handles up to 50,000 records per module but drops ticket threads, comments, and attachments entirely. The Data Backup feature covers up to 10 million records — including threads and comments — but delivers attachments as secure download links, not physical files. For full-fidelity extraction with repeatable control, you need the REST API. Forum topics cannot be backed up through any native tool. UI Export and Data Backup are available on Professional and Enterprise plans only — Free, Express, and Standard users must use the API or third-party tools.
What Data Can You Export from Zoho Desk?
Zoho Desk splits the export problem in two: Export for individual module CSVs and Data Backup for an account-level snapshot that includes threads, comments, time entries, and attachment links. The REST API covers everything else. (help.zoho.com)
| Object | Native UI Export | Data Backup | API Export | Format | Known Limitations |
|---|---|---|---|---|---|
| Tickets | Yes (50K limit) | Yes | Yes (GET /api/v1/tickets) |
CSV / JSON | UI export drops threads and comments |
| Threads | No | Yes | Yes (GET /api/v1/tickets/{id}/threads) |
CSV / JSON | Must be fetched per-ticket via API |
| Comments | No | Yes | Yes (GET /api/v1/tickets/{id}/comments) |
CSV / JSON | Must be fetched per-ticket via API |
| Contacts | Yes (50K limit) | Yes | Yes (GET /api/v1/contacts) |
CSV / JSON | UI export loses relational mapping to multiple accounts |
| Accounts | Yes (50K limit) | Yes | Yes (GET /api/v1/accounts) |
CSV / JSON | — |
| Agents | Yes (all records) | Yes | Yes (GET /api/v1/agents) |
CSV / JSON | View/criteria filters disabled for agent export |
| Departments | No | Yes | Yes (GET /api/v1/departments) |
CSV / JSON | — |
| Teams | No | Yes | Yes (GET /api/v1/teams) |
CSV / JSON | — |
| Products | Yes (50K limit) | Yes | Yes (GET /api/v1/products) |
CSV / JSON | — |
| KB Articles | Yes (50K limit) | Yes | Yes (GET /api/v1/articles) |
CSV / JSON | Article body (HTML) only via API or backup; criteria-based export disabled |
| Tasks | Yes (50K limit) | Yes | Yes (GET /api/v1/tasks) |
CSV / JSON | — |
| Calls | Yes (50K limit) | Yes | Yes (GET /api/v1/calls) |
CSV / JSON | — |
| Events | Yes (50K limit) | Yes | Yes (GET /api/v1/events) |
CSV / JSON | — |
| Time Entries | No | Yes | Yes (GET /api/v1/tickets/{id}/timeEntry) |
CSV / JSON | Must be fetched per-ticket via API |
| Attachments | No | Download links only | Yes (GET /api/v1/tickets/{id}/attachments) |
Binary | Backup gives URLs, not files. API required to download. |
| Custom Modules | Yes (50K limit) | No | Yes (GET /api/v1/{moduleApiName}) |
CSV / JSON | — |
| Custom Field Values | Yes | Yes | Yes | CSV / JSON | Values export with records; field definitions need metadata APIs |
| Forum Topics | No | No | Limited (Community API) | JSON | Explicitly excluded from Data Backup (help.zoho.com) |
Fully exportable in practice: tickets, contacts, accounts, agents, and most other flat standard-module records. Partially exportable: threads, comments, attachments, KB hierarchy, and custom-field schema. Hard documented gap: forum topics.
[For engineering] The native UI CSV export silently omits ticket threads, comments, and time entries. If you export a Tickets CSV, you get ticket-level metadata — subject, status, assignee, custom fields — but zero conversation history. This is the most common surprise for teams attempting a CSV-based migration. The UI export also omits internal system IDs for relational mapping. Without those IDs, you would need to fuzzy-match on email addresses or names to rebuild parent-child relationships between contacts, accounts, and tickets in a destination system.
If you're planning to move this data into another platform, the export is only step one. For migration-specific guidance, see our guides on Zoho Desk to Freshdesk migration, Zoho Desk to Intercom migration, or Zoho Desk to Zendesk migration.
Export Methods: Every Way to Get Data Out of Zoho Desk
There are five practical paths to extract data. The right choice depends less on record count than on whether you need conversation history, attachments, repeatability, or no-code execution. (help.zoho.com)
| Method | Data Coverage | Volume Limit | Speed | Complexity | Plan Requirement | Best For |
|---|---|---|---|---|---|---|
| Native UI Export | Single module, flat fields | 50,000 records | Minutes | Low | Professional+ | Ad-hoc reporting, filtered contact/ticket lists |
| Data Backup | All modules + threads + comments | 10 million records | Hours to days | Low | Professional+ | Full snapshots, compliance archives, migration staging |
| REST API | All objects + relationships + attachments | Credit-limited per day | Hours to days | High | All editions (credit limits vary) | Custom integrations, delta syncs, full migrations |
| ETL/Reporting Tools (Skyvia, Coupler.io) | Depends on connector | Varies | Hours | Medium | Depends on tool | Recurring syncs to data warehouses |
| Managed Service (ClonePartner) | Full fidelity | No practical limit | Days | None (handled) | N/A | Platform migrations, complex datasets |
One distinction worth knowing: Skyvia supports Zoho Desk for ETL, export, replication, and sync — but Skyvia Backup does not support Zoho Desk. That matters if your project is backup-oriented rather than reporting-oriented. (docs.skyvia.com)
[For PMs] Native UI Export and Data Backup require zero engineering but are only available on Professional and Enterprise plans. Free, Express, and Standard users must use the API or third-party tools. ETL/reporting tools require some technical configuration. The REST API requires a developer experienced with OAuth 2.0. A managed service offloads the engineering entirely.
Native UI Export: Step by Step
If you only need flat records — ticket metadata, contact lists, account data — the module export UI is the fastest path. It will not give you conversation history.
- Select a specific department from the top navigation. Export is department-specific and is not available from the "All Departments" view. For multi-department instances, you must repeat the export process for each department separately and merge the results downstream. (help.zoho.com)
- Go to Setup → Data Administration → Export and click New Export.
- Select the module (Tickets, Contacts, Accounts, Tasks, etc.).
- Choose your export scope: All Records, Export Based on Views, or Export Based on Criteria.
- Select All Fields or Specific Fields.
- Set the time frame using Created Time, Closed Time, Modified Time, or Completed Time, with predefined or custom date ranges.
- Optionally encrypt with a password.
- Click Export and download the CSV from export history. The download link is valid for 7 days.
Native UI export limits:
- 50,000 records per export, one module at a time.
- All Date/Time columns export in GMT regardless of the user's timezone.
- Agent export disables views and criteria — you can only export all agents.
- Article export disables criteria-based filtering.
- Only the first five lookup fields export both the lookup ID and lookup name. Additional lookups export only the ID. (help.zoho.com)
- Native export cannot export blueprint views such as Active Blueprint Tickets.
- Department-scoped only. There is no "export all departments at once" option in the UI. For organizations with many departments, this adds significant manual overhead.
The critical gap: The CSV file contains only top-level metadata per module. It does not contain conversation threads, agent comments, time entries, or attachments. If you are migrating to a new helpdesk, a ticket CSV without conversation history is effectively useless for preserving customer context.
Data Backup: Step by Step
For broader extraction that includes threads and comments, use the Data Backup tool. This is Zoho Desk's intended path for disaster recovery, compliance snapshots, and migration staging.
- Log in as the primary contact. Only the primary contact can create or download backups.
- Go to Setup → Data Administration → Data Backup.
- Choose Full Backup (all data) or Custom Backup (limited to a 31-day window).
- Optionally encrypt with a password.
- Click Download Now. The backup produces a ZIP file containing multiple CSV files — one per module.
Data Backup file structure: The ZIP contains a flat directory of CSV files named by module — e.g., Tickets.csv, Threads.csv, Comments.csv, Contacts.csv, Accounts.csv, Attachments.csv (metadata and download links), TimeEntry.csv, Tasks.csv, Calls.csv, Events.csv, Products.csv, Articles.csv, Agents.csv, Teams.csv, Departments.csv. Each CSV includes Zoho internal IDs that serve as foreign keys across files (e.g., ticketId in Threads.csv maps to id in Tickets.csv). These IDs are critical for reconstructing relationships.
Data Backup constraints:
- 10 million record hard limit. If your instance exceeds this, the backup will fail and you must contact Zoho support. (help.zoho.com)
- The download link expires after 7 days.
- After a full backup, you cannot initiate another for 30 days.
- Scheduled backups are available weekly, bi-weekly, monthly, or quarterly. The first scheduled run is full; later runs include only new and modified data.
- Only one scheduled backup can be created per month.
- Not department-scoped. Unlike UI Export, Data Backup covers all departments in a single operation.
Attachments are not included as files. The Data Backup CSV includes secure download links for each attachment — not the physical files. To download the actual binaries, you must use the Zoho Desk API endpoint GET /api/v1/tickets/{ticketId}/attachments/{attachmentId}/content with a valid OAuth token. This is the single most labor-intensive step in any Zoho Desk data export.
The backup covers: tickets (with threads, comments, time entries, and attachment links), contacts, accounts, activities (tasks, calls, events), products, KB articles, agents, teams, and departments. Forum topics are explicitly excluded from backup.
API-Based Export: Endpoints, Pagination, and Rate Limits [For Engineering]
For full-fidelity export — every thread, comment, physical attachment, and relational link — you need the Zoho Desk REST API. The API is available on all editions, including Free, though credit allocations vary significantly (see rate limits below).
Authentication
Zoho Desk uses OAuth 2.0. Register your application at api-console.zoho.com, obtain a Client ID and Client Secret, then generate access tokens via the Authorization Code flow or the Self-Client flow for server-to-server scripts. Access tokens expire after approximately 1 hour; use refresh tokens for long-running extractions. Include both the Authorization and orgId headers in every request. Use the data-center-specific api_domain from the token response as your base URL — not a hardcoded domain. (desk.zoho.com)
Data center base URLs:
| Data Center | API Base URL |
|---|---|
| US | desk.zoho.com |
| EU | desk.zoho.eu |
| IN | desk.zoho.in |
| AU | desk.zoho.com.au |
| CN | desk.zoho.com.cn |
| JP | desk.zoho.jp |
Always use the api_domain returned in your OAuth token response rather than hardcoding these values.
orgId is available in Setup → Developer Space → APIs within the Zoho Desk admin panel.
If you still have old scripts using permanent auth tokens, treat them as technical debt — Zoho has deprecated auth-token authentication in favor of OAuth. (docs.skyvia.com)
Key Endpoints for Export
| Need | Endpoint | Notes |
|---|---|---|
| List tickets | GET /api/v1/tickets |
Max 100 per page. Supports modifiedTime filter for delta exports. |
| Get single ticket | GET /api/v1/tickets/{ticket_id} |
For hydration and enrichment passes |
| List threads | GET /api/v1/tickets/{ticket_id}/threads |
Per-ticket conversation history |
| List comments | GET /api/v1/tickets/{ticket_id}/comments |
Per-ticket internal notes |
| List attachments | GET /api/v1/tickets/{ticket_id}/attachments |
Per-ticket attachment metadata |
| Download ticket attachment | GET /api/v1/tickets/{ticket_id}/attachments/{attachment_id}/content |
Binary file download |
| Download thread attachment | GET /api/v1/tickets/{ticket_id}/threads/{thread_id}/attachments/{attachment_id}/content |
Thread-level file download |
| Download comment attachment | GET /api/v1/tickets/{ticket_id}/comments/{comment_id}/attachments/{attachment_id}/content |
Comment-level file download |
| List contacts | GET /api/v1/contacts |
Max 100 per page |
| List accounts | GET /api/v1/accounts |
Max 100 per page |
| List KB articles | GET /api/v1/articles |
Max 50 per page |
| KB categories | GET /api/v1/kbCategories |
Needed to reconstruct KB hierarchy |
| KB sections | GET /api/v1/kbCategories/{categoryId}/sections |
Section-level structure |
| Activities | GET /api/v1/tasks, /calls, /events |
Standard listing endpoints |
| Time entries | GET /api/v1/tickets/{ticket_id}/timeEntry |
Per-ticket |
| Field schema | GET /api/v1/organizationFields?module=tickets |
Export field definitions instead of guessing cf_* names |
| Module discovery | GET /api/v1/organizationModules |
Enumerate available and custom modules |
| Custom modules | GET /api/v1/{moduleApiName} |
Generic record listing for custom modules |
| Agents | GET /api/v1/agents |
Includes profile, role, and associated departments |
| Departments | GET /api/v1/departments |
Needed for department mapping |
| Layouts | GET /api/v1/layouts?module=tickets |
Layout and field arrangement metadata |
| Profiles/Roles | GET /api/v1/profiles, GET /api/v1/roles |
For exporting permission structures |
| SLA policies | GET /api/v1/slaPolicies |
Read-only; must recreate in destination |
| Blueprint configs | GET /api/v1/blueprints?module=tickets |
Read-only; must recreate in destination |
Department Scoping in the API
Unlike the UI Export, the API is not inherently department-scoped for most endpoints. However, the departmentId parameter is required or recommended on many listing calls (tickets, KB articles, etc.). For multi-department instances, iterate over all departments obtained from GET /api/v1/departments and pass departmentId as a query parameter on each listing call. Some endpoints (contacts, accounts) are portal-wide and do not require department scoping.
Pagination
Zoho Desk listing APIs use offset pagination via from and limit parameters. Zoho's public documentation is internally inconsistent on the specifics: the general API introduction describes a maximum of 50 resources per request, while endpoint-specific docs for tickets show limit values up to 100. In practice, plan around 50 as the safe floor, then test 100 per request on the specific endpoint and data center you will use in production. Loop until the returned array is shorter than limit or empty. (desk.zoho.com)
Delta / Incremental Export Strategy
For recurring syncs or incremental backups, avoid re-exporting the entire dataset each time. Use the modifiedTime filter on listing endpoints to retrieve only records changed since your last export:
GET /api/v1/tickets?modifiedTimeRange=2024-01-15T00:00:00Z,2024-01-22T00:00:00Z&sortBy=modifiedTime
Store a high-water mark (the modifiedTime of the most recently modified record in your last sync) and use it as the lower bound in your next run. This approach dramatically reduces API credit consumption for ongoing syncs. Note: modifiedTime filtering is available on tickets, contacts, and accounts, but not on all sub-resources (threads, comments). For child objects, you may need to re-fetch threads/comments for any ticket whose modifiedTime exceeds your high-water mark.
API Credits and Rate Limits
Zoho Desk uses a credit-based rate limiting model, not a simple per-minute request cap. Credits are consumed per API call and vary by the record range being accessed.
Daily credits by edition (per 24-hour cycle, resets at midnight data center time):
| Edition | Base Credits | Per-User Credits | Example: 50 users |
|---|---|---|---|
| Free / Trial | 5,000 | 0 | 5,000 |
| Express | 25,000 | 100/user | 30,000 |
| Standard | 50,000 | 250/user | 62,500 |
| Professional | 75,000 | 500/user | 100,000 |
| Enterprise / Zoho One | 100,000 | 1,000/user | 150,000 |
Credit cost scales with pagination depth. Early-range listing calls (records 1–2,000) cost approximately 3 credits each. Mid-range (2,001–10,000) costs 10 credits. Deeper ranges (10,001–100,000) cost 50 credits, and very deep ranges cost 100 credits. This means naive high-offset API exports become expensive long before network throughput is the bottleneck. (desk.zoho.com)
Concurrency limits (simultaneous active API calls shared across all OAuth integrations for the portal):
| Edition | Max Concurrent Calls |
|---|---|
| Free | 5 |
| Express | 10 |
| Standard | 10 |
| Professional | 15 |
| Enterprise | 25 |
When credits are exhausted or concurrency is exceeded, the API returns HTTP 429. Zoho's documentation does not clearly guarantee a Retry-After header in all 429 scenarios, so implement exponential backoff regardless. (desk.zoho.com)
Example Extraction Script
import random
import time
import requests
BASE = f"{api_domain}/api/v1/tickets"
HEADERS = {
"Authorization": f"Zoho-oauthtoken {access_token}",
"orgId": org_id,
}
from_idx = 1
limit = 100 # fall back to 50 if your endpoint or data center rejects 100
rows = []
while True:
try:
resp = requests.get(
BASE,
headers=HEADERS,
params={"from": from_idx, "limit": limit, "sortBy": "createdTime"},
timeout=60,
)
except requests.exceptions.ConnectionError:
time.sleep(5)
continue
except requests.exceptions.Timeout:
time.sleep(10)
continue
if resp.status_code == 429:
# Zoho docs do not guarantee Retry-After in all cases
sleep_for = int(resp.headers.get("Retry-After", 0)) or min(
120, 2 ** (4 + random.random())
)
time.sleep(sleep_for)
continue
if resp.status_code == 401:
# Access token expired mid-extraction — refresh and retry
access_token = refresh_access_token(refresh_token, client_id, client_secret)
HEADERS["Authorization"] = f"Zoho-oauthtoken {access_token}"
continue
if resp.status_code >= 500:
# Zoho server error — retry with backoff
time.sleep(30)
continue
resp.raise_for_status()
batch = resp.json().get("data", [])
if not batch:
break
rows.extend(batch)
from_idx += len(batch)
if len(batch) < limit:
break
time.sleep(0.5) # reduce concurrency spikesThroughput math: On an Enterprise plan with 50 users (150,000 daily credits), listing tickets at 100 per call costs ~3 credits each in the first 2,000-record range. But each ticket also requires separate calls for threads, comments, and attachments. A realistic sustained export rate for a full dataset — including child objects and retry backoff — is roughly 5,000–10,000 tickets per hour. For 100,000 tickets with full history, plan for 200,000–300,000 total API calls spread over several days of sustained extraction.
Community API for Forum Topics
Forum topics are the one data type explicitly excluded from both UI Export and Data Backup. Zoho provides a Community API for programmatic access, though it is less well-documented than the core Desk API.
Key endpoints:
| Need | Endpoint | Notes |
|---|---|---|
| List forum categories | GET /api/v1/community/forumCategories |
Top-level forum structure |
| List forums | GET /api/v1/community/forumCategories/{categoryId}/forums |
Forums within a category |
| List topics | GET /api/v1/community/forums/{forumId}/topics |
Topics within a forum |
| Get topic | GET /api/v1/community/topics/{topicId} |
Full topic content |
| List topic comments | GET /api/v1/community/topics/{topicId}/comments |
Replies on a topic |
These endpoints use the same OAuth 2.0 authentication and orgId header as the core API. Pagination follows the same from/limit pattern. Credit costs apply. Coverage is read-only — you can extract forum data but cannot programmatically create topics via the Desk API (community contribution endpoints are separate).
For organizations with active community forums, export forum data before deactivating your Zoho Desk account, as there is no other recovery path.
Does Zoho Desk Let You Export Attachments?
No native export path gives you physical attachment files. The UI CSV export does not include them at all. The Data Backup includes secure download links in the CSV output, but not the files themselves. To download actual binaries, you must call the API. (help.zoho.com)
A safe attachment export workflow:
- Run Data Backup or extract ticket, thread, and comment metadata via API.
- Collect every attachment
hrefor secure download URL. - Download the binary files in a second pass using
GET /api/v1/tickets/{ticketId}/attachments/{attachmentId}/contentwith a valid OAuth token. - Store a mapping table:
zoho_attachment_id → source ticket/thread/comment → downloaded file path/checksum. - Verify file integrity by comparing the downloaded file size against the
sizefield in the attachment metadata response.
Attachment gotchas:
- Inline images: Images pasted directly into ticket replies are often hosted on Zoho's CDN and referenced as
img srcURLs in the thread HTML. If your Zoho Desk account is later deactivated, every inline image breaks permanently. For migration scenarios, parse the HTML body of every thread, download all images from Zoho domains (desk.zoho.com,desk.zoho.eu,writer.zoho.com, etc.), and rewrite the URLs to point to your new hosting destination. - File size limits: Zoho Desk allows attachments up to 20 MB per ticket (or higher on Enterprise plans). Bulk downloading terabytes of attachments will heavily consume your daily API credits.
- Thread vs. ticket attachments: Attachments can exist at three levels — ticket-level, thread-level, and comment-level. Each requires a different API endpoint to download. Ensure your extraction script covers all three.
- No documented bulk download bandwidth cap exists, but the credit system, concurrency limits, and 7-day backup download window act as effective throttles.
If attachments matter, do a sample restore test — not just a sample export. Download a random set of files from tickets, threads, and comments, open them, and verify that every file can still be tied back to the correct parent record.
What Data Cannot Be Exported from Zoho Desk?
Be explicit in your planning. Some data has no native export path at all, and configuration data is a separate problem from business data.
| Data Type | Exportable? | Workaround |
|---|---|---|
| Forum Topics | No (explicitly excluded from backup) | Use Community API endpoints (see section above) |
| Workflow / Automation Rules | No | Manually document and recreate in destination |
| Blueprint Configurations | No native export | Use GET /api/v1/blueprints?module=tickets to read configs; recreate manually |
| Blueprint Views | No (cannot export Active Blueprint Tickets view) | Export tickets by criteria or API instead |
| Custom Views / Saved Filters | No | Recreate manually in destination |
| SLA Policies | No native export | Use GET /api/v1/slaPolicies to read; recreate in destination |
| User Permissions / Roles | No native export | Use GET /api/v1/profiles and GET /api/v1/roles to read |
| Analytics / Report Configs | No | Recreate manually |
| Integration Configurations | No | Reconfigure in destination |
| Audit Logs | Limited | GET /api/v1/tickets/{id}/History for per-ticket history only |
| Deleted Records | Partial | GET /api/v1/recycleBin for trashed items; permanently deleted records (past ~60 days) are unrecoverable |
If you care about auditability, treat configuration as a separate workstream from data. Zoho exposes some configuration surfaces via APIs (organizationFields, layouts, layoutRules, dataSharingRules, slaPolicies, blueprints, profiles, roles), but there is no single native export bundle for operating logic. The difference between "I have my records" and "I can rebuild the system" is a configuration inventory built one API call at a time. (help.zoho.com)
Zoho Desk internal IDs are portable as reference keys for mapping during migration but have no meaning in a destination platform. Maintain a permanent ID crosswalk table to preserve relationships (contact → ticket, account → contact) during any migration.
Note on Zoho Desk Sandbox: If your organization uses a Zoho Desk sandbox environment, be aware that sandbox data is separate from production. The sandbox has the same API endpoints but its own orgId. Export capabilities and limits are identical to production, but sandbox data is not included in production Data Backups.
Data Format, Encoding, and Cleanup After Export
Zoho Desk gives you CSV from native UI export, a ZIP of multiple CSV files from Data Backup, and JSON from the REST API. CSV files use UTF-8 encoding. All Date/Time columns in CSV exports are written in GMT regardless of the user's timezone. (help.zoho.com)
Common cleanup tasks after export:
- Timezone normalization: Convert GMT timestamps to your destination platform's expected format or warehouse timezone model. Always prefer API UTC timestamps over localized CSV timestamps for migrations. API JSON responses return timestamps in ISO 8601 format (e.g.,
2024-01-15T14:30:00.000Z). - HTML in text fields: Thread content and ticket descriptions export as raw HTML. Ensure your destination can render it, or write a parser to convert to Markdown or plain text. Common Zoho HTML patterns include
<div>wrappers,<br>line breaks, and<span style="...">inline formatting. - Orphaned references: If tickets are deleted during a long-running API extraction, or if you export contacts before accounts, records may reference IDs that don't exist in your export. Check for orphaned threads referencing missing
ticket_idvalues. Mitigate by exporting parent records (accounts) before children (contacts, tickets). - Lookup field limits: Beyond five lookups, the CSV export includes only the lookup ID, not the display name. Enrich these by joining against module exports or API responses.
- Custom field definitions: Export field definitions separately using the
organizationFieldsandlayoutsAPIs so your custom fields are not just opaquecf_*columns in a CSV. (desk.zoho.com) - Encoding: Ensure extraction scripts enforce UTF-8. Zoho Desk supports global characters, and failing to enforce UTF-8 will result in corrupted text (mojibake) in customer names and ticket bodies.
- Picklist and multi-select values: These export as plain text strings. Multi-select fields use a semicolon (
;) delimiter. Validate that your destination system's import correctly splits these.
Post-export validation checklist:
- Match record counts for each exported object against Zoho Desk UI totals or API counts.
- Spot-check at least 10–20 tickets across different statuses, departments, date ranges, and channels for thread/comment completeness.
- Verify all attachment download links are accessible and download a sample set — open the files.
- Check that custom field values exported correctly, especially picklists and multi-select fields.
- Validate date formats and timezone offsets.
- Confirm no truncation on long-text fields (descriptions, resolutions).
- Preserve original Zoho IDs as external IDs for migration mapping.
- Verify thread ordering within tickets is chronologically correct (sort by
createdTime). - Confirm that inline images in thread HTML bodies are still accessible and rendering.
Export for Migration vs. Backup vs. Compliance
These are three different jobs with different requirements.
Migration requires the most work. You need full relationship fidelity (ticket → contact → account), an ID mapping table between source and destination, thread/comment ordering preserved, and attachments physically downloaded and re-uploaded. The export format must match your destination's import requirements.
For migration, use Data Backup or the REST API — not module CSVs alone. Zoho Desk Departments typically map to Groups in destination platforms, and Threads/Comments map to Conversations or Replies. For platform-specific mapping guidance:
For general migration strategy, see our help desk data migration playbook.
Comparison note for Zoho CRM users: If you also use Zoho CRM, its export capabilities differ significantly. Zoho CRM supports bulk CSV export with higher native limits (up to 200,000 records via data export) and has a more mature bulk API. However, CRM does not share an export tool with Desk — you must export each product separately and map shared records (contacts, accounts) by email or Zoho ID.
Backup needs a complete, periodic snapshot. Zoho Desk's scheduled Data Backup handles this for most requirements. The first scheduled run is full; later runs include only new and modified data. The 10-million-record cap and 30-day cooldown between full backups are the main constraints. Store the ZIP in AWS S3, Google Cloud Storage, or equivalent cold storage with versioning enabled.
Compliance (GDPR / DSAR) requires the ability to export or erase a specific individual's data. Zoho Desk provides a Subject Access Request (SAR) API (POST /api/v1/subjectAccessRequests/exportAll) that exports all data related to a specific contact email across tickets and contacts, supporting GDPR Article 20 data portability rights. For broader GDPR migration guidance, see our GDPR-compliant data migration blueprint. For legal-grade responses, validate scope with counsel rather than assuming the default export is sufficient for every request.
Data Portability Assessment [For CTOs]
Zoho Desk portability rating: Mostly Portable.
Ticket metadata, contacts, accounts, and KB articles can all be cleanly extracted. The main friction points are:
- Thread/comment extraction requires the API or Data Backup — not the module-level UI export that most users try first.
- Attachments require secondary API calls to download physical files from secure links.
- Forum topics are excluded from Data Backup and require separate Community API calls.
- Configuration data (workflows, blueprints, automations, SLAs) has no bulk export path and must be reconstructed manually or read one API at a time.
- API credit economics make deep-offset exports increasingly expensive, which constrains throughput for very large datasets.
- Plan-gated features: UI Export and Data Backup require Professional or Enterprise plans. Free and Standard users are limited to the API.
Zoho's terms do not restrict data export. The real switching cost is engineering time: building scripts to paginate through the API, handle rate limits, download attachments, and transform data for your destination platform. Access is permission-gated: UI export requires the Export Records permission, and Data Backup is restricted to the primary contact. (help.zoho.com)
For organizations with 100K+ tickets, switching typically represents 2–4 weeks of dedicated developer effort — or a budget for a specialized migration service. For architectural comparisons that affect migration complexity, see our Zoho Desk vs Jira Service Management guide.
Timeline and Resourcing for a Full Data Export [For PMs]
These are planning numbers, not vendor SLAs. They are based on Zoho's published export caps, backup behavior, and API credit model.
| Dataset Size | Recommended Path | Minimum Team | Realistic Elapsed Time |
|---|---|---|---|
| Under 10K records, light attachments | Native UI Export or Data Backup | 1 admin | Same day to 1 business day |
| 10K–100K records, needs history | Data Backup + validation, or API if you need filtering | PM + admin + part-time developer | 3–7 business days |
| 100K+ records or heavy attachments | Data Backup + scripted attachment download + full validation | PM + developer + ops analyst | 1–3 weeks |
Phase breakdown for a full API-based export:
- Scoping (0.5–2 days): Identify objects, custom fields, attachments, relationships, and total volume. Run
GET /api/v1/tickets?limit=1and check the response headers or use UI dashboard counts to estimate total records per module. - API setup (0.5–1 day): Register OAuth app, generate tokens, configure data center routing, verify
orgId. Test a single request per endpoint. - Extraction (3–14 days): Paginate through all objects, handle 429/401/500 errors, download attachments. Credit limits will gate your daily throughput. Use
modifiedTimefiltering for incremental runs. - Validation (1–3 days): Reconcile record counts, spot-check data integrity across tickets/threads/attachments.
- Cleanup (1–2 days): Fix encoding issues, normalize timestamps, map IDs, resolve orphaned references, enrich lookup fields.
Minimum team: UI export or Data Backup requires no developer. API-based export requires at least one developer experienced with REST APIs and OAuth 2.0. A managed service offloads all of it.
When to Bring in Help
If you are exporting data to migrate away from Zoho Desk, ClonePartner handles the entire extraction programmatically — resolving secure attachment links, reconstructing full conversation threads, mapping custom fields, and working within Zoho Desk's credit-based API limits and concurrency constraints. That matters most when the project is not just "get the rows out," but "preserve the history well enough that the next system can actually use it."
Frequently Asked Questions
- Can I export all my data from Zoho Desk?
- You can export most business data using a combination of native tools and the REST API. The UI export covers flat module records up to 50,000 per run. Data Backup covers up to 10 million records including threads and comments. Forum topics are excluded from Data Backup and require the Community API. Configuration data like workflows and blueprints cannot be bulk exported.
- Does Zoho Desk export include attachments?
- Not as physical files. The UI CSV export does not include attachments at all. The Data Backup provides secure download links for each attachment in the CSV output, but not the actual binaries. To download the files, you must call the Zoho Desk API for each attachment individually.
- How long does it take to export data from Zoho Desk?
- A UI export of a single module completes in minutes. A full Data Backup takes hours depending on data volume. An API-based full export of 100K+ tickets with threads, comments, and attachments can take 1–3 weeks of development and execution time, gated by daily API credit limits.
- What is the record limit for Zoho Desk data export?
- Native UI export supports up to 50,000 records per module per export. Data Backup supports up to 10 million records total. The REST API has no hard record limit but is constrained by daily credit allocations and concurrency caps that vary by plan edition.
- What format does Zoho Desk export data in?
- Native UI export produces CSV files. Data Backup produces a ZIP file containing multiple CSVs — one per module. The REST API returns JSON. All Date/Time columns in CSV exports are written in GMT regardless of the user's timezone.
