How to Export Data from Desk365: Methods, API Limits & Portability
Export data from Desk365 via native CSV or REST API v3. Covers every exportable object, plan-specific rate limits, attachments, and what can't be exported.
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
What Data Can You Export from Desk365?
Desk365 is a cloud-based helpdesk built for the Microsoft 365 ecosystem. Its data model centers on Tickets, Contacts, Companies, Time Entries, Knowledge Base Articles, Surveys, and Contracts. The exportability of each object depends on whether you use the native UI export or the REST API.
The Exports tab in the Settings > Admin section lets you track and manage all export activity related to tickets, contacts, and companies across your helpdesk.
| Object | Native UI Export | API Export (v3) | Export Format | Known Limitations / Gaps |
|---|---|---|---|---|
| Tickets | Yes | Yes (GET /v3/tickets) |
CSV / JSON | By default, the "Get all tickets" operation does not include the ticket description. You must set the "Include Description" parameter to "Yes". UI export excludes conversation threads, replies, and notes. |
| Archived Tickets | Yes (separate view) | Yes (same tickets endpoint) | CSV / JSON | UI requires the Archived Tickets view separately — the "All Tickets" export does not include archived tickets. The API's tickets endpoint includes archived records without needing a separate call. |
| Conversations (Replies, Notes) | No | Yes (GET /v3/tickets/{id}/conversations) |
JSON | Must be fetched per-ticket. Includes agent replies, contact replies, and private/public notes with HTML body. Does not include the original ticket description — you must fetch that from the ticket endpoint with include_description=1. |
| Contacts | Yes | Yes (GET /v3/contacts) |
CSV / JSON | In contact exports, Desk365 includes both the primary department and any secondary departments the contact belongs to. |
| Companies | Yes | Yes (GET /v3/companies) |
CSV / JSON | In company exports, you will see a list of all the departments that have been created for each company. |
| Time Entries | Yes | Yes (GET /v3/time_entries) |
CSV / JSON | When customizing the export, you can select ticket fields, custom fields, and contact fields, as well as time entry fields like time spent, billable hours, etc. |
| Knowledge Base Articles | No | Yes (GET /v3/kb/articles) |
JSON | Articles returned with HTML and plain text content, view/like counts, and status (draft/published). No native CSV export. |
| KB Categories & Folders | No | Yes (GET /v3/kb/categories, /v3/kb/folders) |
JSON | Includes visibility settings, company-level access controls, and parent category mapping. |
| Surveys | No | Yes (GET /v3/surveys, /v3/surveys/ratings) |
JSON | Survey ratings can also be included inline with ticket responses via include_survey_details=1. |
| Contracts | No | Yes (GET /v3/contracts) |
JSON | API-only. Desk365 documentation notes that special access may be required. The contracts endpoint may be restricted to Premium plan users — verify access before building extraction scripts. |
| Attachments | No | Partial (via conversations endpoint) | JSON (URLs) | Attachment metadata and download URLs are returned in conversation responses. No bulk download endpoint. |
| Automations / Workflows | No | No | — | No export mechanism exists. Must be manually recreated. |
| SLA Configurations | No | No | — | SLA names appear on tickets, but the rules and escalation logic cannot be exported. |
| Custom Views / Saved Filters | No | No | — | Not exportable. Must be manually documented. |
| Agent Roles & Permissions | No | No | — | No API endpoint for role definitions or permission matrices. |
| Macros / Canned Responses | No | No | — | Not available in any export format. |
Fully exportable: ticket metadata, contacts, companies, time entries, surveys, contracts, and KB article content. Partially exportable: conversations, attachments, and KB article attachments — these require extra API steps or are only partly documented. Not exportable: admin configuration — automations, SLAs, roles, views, macros, and integration settings.
[For engineering] The native CSV ticket export silently drops all conversation data — replies, notes, and attachments are not included. If a custom field is deleted in the UI, its historical data on older tickets is also lost in the CSV export. You must use the API to capture the full state of any ticket object.
How Do I Export Tickets from Desk365? (Native UI Export)
When you export tickets from a helpdesk, you are essentially creating a copy of your ticket data in a different format, such as a CSV file. Desk365 makes it easy for you to export your tickets in just a few simple steps.
Step-by-step: Exporting tickets from the agent portal
- Log in to your Desk365 agent portal as an Administrator.
- Navigate to the Tickets tab and select All Tickets from the Views list.
- Click the Export button at the top of the ticket list.
- In the export dialog, choose a time filter: Created Time, Resolved Time, or Closed Time.
- Select the ticket fields, custom fields, and contact fields you want included.
- Click Export. You'll receive the exported file in your email inbox in .csv format.
Five export modes in the native UI
Several types of export options are available in Desk365: Standard ticket view, Current ticket view, Custom view, Search tickets, and Time entries.
| Export Mode | What It Covers | Best For |
|---|---|---|
| All Tickets (Standard view) | Every active ticket in your helpdesk | Full ticket metadata backup |
| Current View | Only tickets visible in your active view (e.g., "My Open and Pending") | Quick operational snapshots |
| Custom View | Tickets matching a saved custom filter (e.g., "Urgent tickets from Company X") | Targeted reporting |
| Search Tickets | Tickets matching a keyword search by subject, description, or ticket number | Ad-hoc investigation |
| Time Entries | Tickets with time tracking data, including billable hours | Client billing and time audits |
Critical gotcha: To export all tickets including archived ones, you must run two separate exports — one from the "All Tickets" view and one from the "Archived Tickets" view. Desk365 does not combine these automatically.
Scheduled exports
You can schedule a report to export the entire list of active tickets directly from the "All Tickets" view in your helpdesk. Configure the export details like frequency, time, timezone, and recipients.
Scheduled exports support daily, weekly, or monthly frequencies. This is useful for recurring backup or reporting workflows without manual intervention. Scheduled exports are available on the Plus and Premium plans.
To set up: go to Tickets > Actions > Scheduled Exports > New Schedule, choose your frequency, recipients, and field selection.
[For PMs] Scheduled exports require zero engineering — any agent with the correct role permissions can configure them.
Support portal export
End users can also export tickets from the Desk365 support portal. Available scopes include All Tickets, Department or Company Tickets, Tickets Created by Me, and Tickets Shared with Me. Admins control which fields appear in support portal exports from Settings > Channels > Support Portal > Configure ticket export fields.
What the native export misses
The CSV export gives you ticket metadata: ticket number, subject, status, priority, agent, contact info, custom fields, timestamps, and duration metrics. It does not include:
- Conversation threads (replies and notes)
- Attachment files or URLs
- Full HTML description (unless the API is used with
include_description=1) - Knowledge base articles
- Survey responses (unless exported separately)
- Relationship data beyond contact-to-company mapping
[For PMs] If your goal is to audit the full history of customer interactions or migrate to another platform, the CSV export alone is insufficient. You need the API to get complete conversation threads and attachments.
Export Methods: Every Way to Get Data Out of Desk365
There are six practical export methods. There is no publicly documented bulk backup API or direct database dump.
| Method | Data Coverage | Volume Limit | Speed | Complexity | Best For |
|---|---|---|---|---|---|
| Agent Portal CSV | Tickets, contacts, companies, time entries | No documented hard limit; view and date filters apply | Fast | Low | Quick reporting, PM audits, no engineering needed |
| Support Portal CSV | End-user-visible ticket scope only | Limited to user/company/shared scopes | Fast | Low | Customer self-service or DSAR-style ticket copies |
| Scheduled Export | Same as agent portal CSV | Same | Automated on schedule | Low | Recurring reporting and lightweight backups |
| REST API v3 | All objects including conversations, KB, surveys, contracts | 10,000 tickets/hour ceiling; plan rate limits apply | Hours to days depending on volume | High | Full-fidelity extraction, migrations, compliance |
| Power Automate | Ticket-centric operations (create, update, get) | Connector-level limits apply | Varies | Medium | Event-driven sync, not bulk export |
| Webhooks | Real-time event payloads (ticket created, updated) | Event-driven, not historical | Real-time | Medium | Continuous data forwarding to external systems; not suitable for historical backups |
[For PMs] The agent portal CSV, support portal CSV, and scheduled exports require zero developer resources. API-based exports require a developer who can write pagination logic and handle rate limiting.
API-Based Export: Endpoints, Pagination, and Rate Limits [For Engineering]
The Desk365 REST API v3 is the only way to extract full-fidelity data, including conversation threads, knowledge base content, and survey data.
Authentication
Each subdomain has its own unique API Key, which ensures that only authorized users can access data for that specific subdomain. The API key is passed in the Authorization header of every HTTP request. Find your unique API key in the Desk365 portal: Go to Settings > Integrations > API and copy your API key.
Multi-subdomain note: If your organization operates multiple Desk365 subdomains (e.g., per business unit), each subdomain has an independent API key and data store. Exports must be run per-subdomain — there is no cross-subdomain API.
Base URL format
API requests must now include /v3 in the URL to ensure you're using the latest version.
https://<yoursubdomain>.desk365.io/apis/v3/tickets
Desk365's v3 API supersedes earlier versions. There is no publicly documented deprecation schedule for v2, but all new features and documentation reference v3 exclusively. Build all export scripts against v3.
Core API endpoints for data export
| Endpoint | Method | Returns |
|---|---|---|
/v3/tickets |
GET | List of tickets with metadata, custom fields, survey ratings |
/v3/tickets/{ticket_number}/conversations |
GET | Replies, notes, and attachments for a single ticket (does not include original ticket description) |
/v3/contacts |
GET | Contact records with department associations |
/v3/companies |
GET | Company records with department lists |
/v3/time_entries |
GET | Time tracking data linked to tickets |
/v3/surveys |
GET | Survey configurations |
/v3/surveys/ratings |
GET | All survey ratings, ordered by creation time |
/v3/contracts |
GET | Contract records (may require special access / Premium plan) |
/v3/kb/categories |
GET | Knowledge base category structure and visibility settings |
/v3/kb/folders |
GET | Knowledge base folder hierarchy |
/v3/kb/articles |
GET | Full article content (HTML and plain text), view counts, statuses |
Sample API response: Conversations endpoint
A truncated response from GET /v3/tickets/{ticket_number}/conversations illustrating the structure an export script must parse:
{
"conversations": [
{
"id": 204857,
"ticket_number": 1042,
"type": "reply",
"incoming": false,
"body": "<div>We've resolved the issue with your VPN access...</div>",
"body_text": "We've resolved the issue with your VPN access...",
"from_email": "agent@company.com",
"to_emails": ["user@company.com"],
"cc_emails": [],
"created_time": "2024-11-15 14:32:18",
"attachments": [
{
"name": "vpn-config.pdf",
"size": 245760,
"content_type": "application/pdf",
"attachment_url": "https://yoursubdomain.desk365.io/attachments/download/abc123"
}
]
},
{
"id": 204901,
"ticket_number": 1042,
"type": "note",
"private": true,
"body": "<p>Escalated to network team — awaiting firewall rule change.</p>",
"body_text": "Escalated to network team — awaiting firewall rule change.",
"from_email": "agent@company.com",
"created_time": "2024-11-15 15:10:44",
"attachments": []
}
]
}Key structural details: Each conversation object includes type (reply or note), private (boolean for internal notes), body (HTML) and body_text (plain text), and an attachments array with name, size, content_type, and attachment_url. The original ticket description is not present in this response — it must be retrieved from the ticket object with include_description=1.
Pagination
Version 3 brings a significant improvement to how many tickets you can retrieve in one call. You can now choose to retrieve 30, 50, or 100 tickets per call using the ticket_count parameter.
Pagination uses an offset parameter. To walk through all tickets:
import requests
import time
import json
import re
API_KEY = "your-api-key"
BASE_URL = "https://yoursubdomain.desk365.io/apis/v3"
HEADERS = {"Authorization": API_KEY}
def export_all_tickets():
all_tickets = []
offset = 0
page_size = 100
while True:
params = {
"ticket_count": page_size,
"offset": offset,
"include_description": 1,
"include_custom_fields": 1,
"include_survey_details": 1,
"order_by": "updated_time",
"order_type": "asc"
}
response = requests.get(f"{BASE_URL}/tickets", headers=HEADERS, params=params)
if response.status_code == 429:
# Retry-After header behavior is not confirmed in Desk365 docs.
# Default to 60s as a defensive fallback.
retry_after = int(response.headers.get("Retry-After", 60))
print(f"Rate limited. Waiting {retry_after}s...")
time.sleep(retry_after)
continue
response.raise_for_status()
data = response.json()
tickets = data.get("tickets", [])
if not tickets:
break
all_tickets.extend(tickets)
offset += page_size
# Respect rate limits (Standard: ~1.6 req/min; Plus/Premium: 50 req/min)
time.sleep(1.2) # Safe for Plus/Premium plans
return all_tickets
def export_conversations(ticket_number):
"""Fetch all conversations for a single ticket.
Note: This does NOT include the original ticket description."""
url = f"{BASE_URL}/tickets/conversations"
params = {"ticket_number": ticket_number}
response = requests.get(url, headers=HEADERS, params=params)
if response.status_code == 429:
time.sleep(int(response.headers.get("Retry-After", 60)))
return export_conversations(ticket_number)
response.raise_for_status()
return response.json()
def extract_inline_images(body_html):
"""Parse HTML body for inline images that need to be downloaded
and re-hosted during migration. Handles both URL-referenced and
base64-encoded images."""
img_urls = []
if not body_html:
return img_urls
# Find all <img> src attributes
img_tags = re.findall(r'<img[^>]+src=["\']([^"\']+)["\']', body_html)
for src in img_tags:
if src.startswith("data:image/"):
# Base64-encoded inline image — decode and save separately
img_urls.append({"type": "base64", "data": src})
elif "desk365.io" in src or src.startswith("http"):
# Hosted image — download via URL
img_urls.append({"type": "url", "url": src})
return img_urlsRate limits
Desk365's API rate limits are plan-specific:
| Plan | Rate Limit | Max Tickets/Hour | Cost/User/Month |
|---|---|---|---|
| Standard | 100 API calls per hour | ~10,000 (at 100 tickets/call) | $12 |
| Plus | 50 API calls per minute | ~300,000 (at 100 tickets/call) | $20 |
| Premium | 50 API calls per minute | ~300,000 (at 100 tickets/call) | $32 |
Clarification on "Max Tickets/Hour": The 10,000 figure is the practical ceiling for ticket list extraction — 100 calls × 100 tickets per call. However, conversation extraction requires one additional call per ticket, which is where the rate limit becomes the bottleneck. Plus/Premium plans handle this far more efficiently because their rate limit is per-minute rather than per-hour.
[For engineering] The Standard plan's 100 calls/hour limit is extremely restrictive for bulk exports. If you have more than a few thousand tickets with conversations, either upgrade to Plus/Premium before starting the export or plan for a multi-day extraction window.
Throughput math
Ticket list extraction alone can run at about 10,000 tickets per hour on any plan. But full-fidelity exports are dramatically slower because the conversations endpoint requires at least one additional call per ticket.
Plus/Premium example: For a helpdesk with 10,000 tickets averaging 5 conversations each, you need 100 ticket-list calls plus 10,000 conversation calls — roughly 10,100 total API calls. At 50 calls per minute, that's about 202 minutes (3.4 hours), not counting attachment downloads.
Standard example: Those same 10,100 calls at 100 calls per hour would take approximately 101 hours — over 4 days of continuous extraction.
For 50,000 tickets on Plus/Premium, expect roughly 16–17 hours of API extraction time before attachment downloads begin.
Key API behaviors to watch
- Description is excluded by default. You must pass
include_description=1to get ticket body content. This is a documented parameter in the Desk365 API v3 reference. - Custom fields use the
cf_prefix. All custom field keys in v3 responses are prefixed (e.g.,cf_department,cf_employee_id). Custom field API labels are permanent once created — choose them carefully. - Null values are explicit. Fields with no data return
nullrather than being omitted from the response. - Survey data requires opt-in. Set
include_survey_details=1to get CSAT/NPS ratings inline with ticket data. updated_sincefilter lets you do incremental exports — only tickets modified after a given timestamp are returned. This is a documented filter parameter in the v3 API. Useful for scheduled backup scripts and delta migrations.- Source constants are integers you will need to normalize: 1 = Email, 5 = Microsoft Teams, 6 = Support Portal, 7 = Phone/Other, 12 = Web Form, 13 = Web Widget, 15 = API.
- Throttle error behavior: Desk365's public documentation does not confirm whether a
Retry-Afterheader is returned on HTTP 429 responses. Implement exponential backoff as a defensive measure — start at 60 seconds and double on consecutive failures. - Custom field types are returned as strings. Numeric fields like
cf_employee_idand date fields will be string-typed in JSON responses. Cast types explicitly before importing into a target system.
Does Desk365 Let You Export Attachments?
Desk365 does not include attachment files in CSV exports. Attachments are only accessible through the API's conversations endpoint, where each conversation entry includes an attachments array with name, size, content_type, and attachment_url (see the sample JSON response above).
To export all attachments from a Desk365 instance:
- Fetch all tickets via
/v3/tickets. - For each ticket, call the conversations endpoint to get reply/note objects.
- Parse the
attachmentsarray from each conversation entry. - Download each file using the provided
attachment_url.
There is no bulk attachment download endpoint. Each file must be fetched individually — and each download counts against your API rate limit. Desk365 allows up to 10 files per conversation with a 20 MB combined limit per conversation in the editor, so attachment volume can grow quickly across thousands of tickets.
Inline images embedded in HTML reply bodies are a separate edge case. These are typically hosted on Desk365's servers as URLs within the HTML body. Some — particularly those pasted from Outlook or Teams — may also be stored as base64-encoded strings within the HTML, or contain Microsoft-specific namespaces (e.g., <o:p>, <v:shape>). If you're migrating to another platform, these image URLs will break unless you download and re-host them. Your export script must parse the body_html of every conversation, identify <img> tags, and download those image sources separately. The extract_inline_images() function in the code sample above demonstrates this pattern.
For KB articles, the API exposes a has_attachments flag, but bulk retrieval of article attachments is not well-documented. Test retrieval on a sample article before building extraction logic.
What Data Cannot Be Exported from Desk365?
Some data types have no export path — not through the UI, not through the API. This is the hard constraint that determines your switching cost.
| Data Type | Exportable? | Workaround |
|---|---|---|
| Automation rules / triggers | No | Manually document every rule (trigger condition, action, order) and recreate in the target platform |
| SLA rule configurations | No | SLA names appear on tickets, but escalation rules, business hours, and target metrics must be manually rebuilt |
| Custom views / saved filters | No | Screenshot or document filter criteria (field, operator, value) before migrating |
| Agent roles & permission matrices | No | Manual documentation required — export a matrix of role names × permission flags |
| Macros / canned responses | No | Copy-paste from the UI; no API endpoint exists |
| Audit trail / field change logs | Partial | Desk365 achieves this through detailed encrypted field logs that record every addition, update, and deletion made to database records. No documented API endpoint to bulk-export these logs; contact Desk365 support to request access. |
| Deleted / permanently deleted records | No | Once a ticket or contact is permanently deleted, it is gone. There is no "recycle bin" endpoint. Permanently deleting a contact also removes related ticket history. |
| Integration configurations | No | Power Automate flows, Jira links, Azure DevOps connections must be recreated manually |
| Custom ticket forms | No | Form structure and field mapping must be documented manually |
| Analytics dashboards | Partial | Report CSVs can be downloaded, but those are summary outputs — not full object exports |
Comparison: Desk365 vs. peers on configuration exportability
For context, here is how Desk365's admin-configuration exportability compares to two common mid-market alternatives:
| Config Object | Desk365 | Freshdesk | Zendesk |
|---|---|---|---|
| Automations / triggers | Not exportable | Not exportable via UI; API read access available | Fully exportable via API (/api/v2/triggers) |
| SLA policies | Not exportable | API read access available | Fully exportable via API (/api/v2/slas/policies) |
| Macros / canned responses | Not exportable | API read access available | Fully exportable via API (/api/v2/macros) |
| Custom roles | Not exportable | API read access (Enterprise only) | Fully exportable via API |
Desk365's gap is that no admin configuration object has API read access. Freshdesk provides read-only API access to most configuration objects. Zendesk exposes nearly all admin objects through its API. This is the single largest differentiator in switching cost between these platforms.
[For CTOs] The inability to export automation rules, SLA configurations, and macros is the single largest hidden switching cost. For teams with complex workflow automations (10+ rules with conditional branching), budget 20–40 hours of manual re-creation work during any migration.
Data Format, Encoding, and Cleanup After Export
File formats and field naming
- Native exports: CSV only, delivered via email.
- API responses: JSON, UTF-8 encoded.
- Rich-text fields: Desk365 exposes both HTML and plain-text variants. Tickets have
descriptionanddescription_text. Conversations havebodyandbody_text. KB articles havearticle_contentandarticle_content_text.
Common data quality issues
-
Microsoft-specific HTML markup. Because Desk365 ingests data from Microsoft Teams, Outlook, and web portals, the HTML in ticket descriptions and replies is often inconsistent. Desk365 data frequently includes Microsoft-specific HTML namespaces like
<o:p>,<v:shape>, andmso-CSS properties generated by Outlook's rendering engine. If you import this raw HTML into a platform like Zendesk or Jira Service Management, it can break ticket rendering or produce unreadable formatting. Sanitize with a library like Python'sbleachorlxmlbefore import — stripmso-*styles and Office namespace tags. -
Timezone handling. API timestamps use the format
YYYY-MM-DD HH:MM:SS. Desk365 does not include timezone offset information in API responses. Verify empirically whether these are UTC or account-timezone-local by comparing a known ticket's API timestamp against its UI-displayed time. Ensure your destination system is configured accordingly. -
Custom field type mismatches. Custom fields in the API response are all returned as strings, even numeric fields like
cf_employee_idor date fields. Cast types appropriately before importing. Build a type map from your Desk365 custom field configuration to avoid silent data corruption. -
Source constants. Desk365 uses integer source constants (1 = Email, 5 = Teams, 6 = Support Portal, 7 = Phone/Other, 12 = Web Form, 13 = Web Widget, 15 = API) that you will need to normalize for your destination system's channel model.
-
Orphaned contacts. Contacts not associated with a company will export without a
company_namevalue. Ensure your import logic handles null company references. -
Duplicate records. If you export from multiple views (e.g., All Tickets + Archived Tickets via the UI), deduplicate on
ticket_numberbefore loading into a target system. Desk365 can also create duplicate contact records if a user emails from an alias not mapped in Azure AD — deduplicate on email address, not contact name.
Post-export validation checklist [For PMs]
- Record count matches: compare exported row count against Desk365's ticket count in the dashboard — count active and archived tickets separately
- Spot-check 10 tickets for field accuracy (status, priority, agent, timestamps)
- Verify custom field values are present and correctly typed
- Confirm conversation thread count matches for sampled tickets — verify the original ticket description is included alongside conversation data
- Validate attachment download URLs are accessible (test 5–10 URLs manually)
- Check for encoding issues in non-English text (look for garbled characters, especially in CJK or accented-character content)
- Confirm date/time values are in the expected timezone
- Verify department, company, watcher, and
share_torelationships where used - Cross-reference survey ratings count against Desk365 dashboard totals
Fastest safe PM approach: Run native CSV exports first for control totals and stakeholder review, then run API extraction for full fidelity. This two-layer approach catches archived-ticket misses early and gives engineering a stable reconciliation target.
Export for Migration vs. Backup vs. Compliance
Your export strategy must match your business goal. If you use the same export for all three, you will either overbuild a report or underbuild a migration.
Migration
A migration export must preserve relationships — tickets linked to contacts, contacts linked to companies, conversations threaded to tickets, attachments linked to messages. The native CSV export breaks most of these relationships because it flattens data into a single table. For migration, the API is the only viable path.
Key requirements:
- Map Desk365
ticket_numberto the target system's internal ID scheme - Preserve conversation chronology (agent replies, customer replies, notes in order)
- Remember that
/v3/tickets/conversationsomits the original ticket description — you must combine ticket description data from the ticket endpoint withinclude_description=1 - Re-host inline images and attachments
- Sanitize Microsoft-specific HTML markup before importing into the target platform
- Recreate custom fields in the target system before importing
- Manually rebuild automations, SLAs, macros, and views (budget 20–40 hours for complex configurations)
For a detailed approach to migrating between helpdesk platforms, see our help desk data migration playbook.
Backup
Desk365 does not offer a built-in full-account backup feature. For backup purposes, combine a weekly scheduled CSV export of ticket metadata with periodic API-based snapshots of conversations and KB articles. JSON is the best format for backup snapshots because it preserves field types, nested structures, and relationship data.
Use the API's updated_since filter to pull only modified tickets and dump results into cloud storage (Azure Blob, S3, or SharePoint) on a cron schedule. A practical backup cadence:
- Daily: Incremental ticket metadata + conversations for tickets updated in the last 24 hours
- Weekly: Full KB article snapshot
- Monthly: Full ticket list + contact/company export for reconciliation
Scheduled CSV export alone is not enough for full restoration — it misses attachments, conversations, KB content, and admin configuration.
Compliance (GDPR, DSAR)
At Desk365, we place a high priority on user privacy and data protection. We have implemented a range of measures to ensure full compliance with GDPR, offering customers enhanced control over their data.
Desk365 strictly adheres to recognized industry security standards, such as SOC 2 Type 2. They also comply with HIPAA within the Premium pricing plan.
For GDPR Article 20 (right to data portability), organisations must provide the data in structured, common, machine-readable formats such as CSV, JSON, or XML, within one month of a valid request. Desk365's CSV and JSON export capabilities satisfy this format requirement.
To fulfill a data-subject access request (DSAR), use the API to filter tickets by the contact's email address, then fetch all conversations for matching tickets. There is no one-click "export all data for this person" button in the UI — DSAR fulfillment requires API scripting. Desk365 does not document a self-serve GDPR portability package or standalone audit-log export. For deletion requests under GDPR Article 17, note that permanently deleting a contact also removes related ticket history — confirm with your DPO whether this meets your retention requirements.
Is Desk365 Data Portable? Vendor Lock-In Assessment [For CTOs]
Portability rating: Mostly Portable (estimated 80–85% of operational data exportable; 15–20% requires manual rebuild)
| Dimension | Assessment |
|---|---|
| Ticket metadata | Fully exportable via CSV and API |
| Conversation history | Fully exportable via API (per-ticket calls required) |
| Contacts & companies | Fully exportable via CSV and API |
| Knowledge base content | Fully exportable via API (HTML + plain text) |
| Attachments | Exportable via API (individual URL downloads, no bulk endpoint) |
| Surveys & ratings | Fully exportable via API |
| Time entries | Fully exportable via CSV and API |
| Contracts | Exportable via API (may require Premium plan) |
| Automations & workflows | Not exportable — must be rebuilt |
| SLA rules | Not exportable — must be rebuilt |
| Custom forms & views | Not exportable — must be documented manually |
| Roles & permissions | Not exportable — must be rebuilt |
| Macros / canned responses | Not exportable — must be rebuilt |
The "80–85% portable" figure covers all customer-facing and operational data: tickets, conversations, contacts, companies, KB content, attachments, surveys, time entries, and contracts. The remaining 15–20% is admin configuration: automations, SLAs, custom views, roles, macros, and integration settings. These must be manually documented from the UI and recreated in the target system.
This portability profile is comparable to Freshdesk, which also lacks UI-based admin export but provides API read access to automation rules. Desk365 falls short of Zendesk, which exposes automations, triggers, macros, SLAs, and roles via API. It is significantly better than platforms that restrict data export contractually or charge export fees.
Desk365 does not impose contractual restrictions on data export. When you cancel, you have time to close tickets, export any needed data, and inform your team. There are no documented data hostage clauses, export surcharges, or time-limited export windows after cancellation.
The real switching cost is engineering time: building API extraction scripts, handling pagination and rate limits, downloading attachments, sanitizing HTML, and rebuilding the configuration layer.
How Long Does a Full Desk365 Export Take? [For PMs]
| Dataset Size | Native UI Export | API Export (Plus/Premium) | API Export (Standard) |
|---|---|---|---|
| Small (<5,000 tickets) | 5–15 minutes | 2–4 hours (with conversations) | 1–2 days |
| Medium (5,000–50,000 tickets) | 15–60 minutes (metadata only) | 1–3 days | 1–2 weeks |
| Large (50,000+ tickets) | Hours (metadata only) | 3–7 days | Not practical — upgrade plan first |
These estimates assume continuous extraction with proper rate limiting. Attachment downloads can add 30–100% additional time depending on volume and file sizes.
Phase breakdown for a full export project
| Phase | Effort | Who |
|---|---|---|
| Scoping & field mapping | 2–4 hours | PM + engineer |
| API key provisioning | 15 minutes | Admin |
| Script development | 4–8 hours | Developer |
| Extraction run | Varies (see table above) | Automated |
| Validation & spot-checks | 2–4 hours | PM + engineer |
| Data cleanup & transformation | 4–16 hours | Engineer |
| Total (medium dataset) | 2–5 days | 1 developer + 1 PM |
Minimum team composition
- UI-only export: 1 admin or PM, no developer needed
- API export: 1 developer (Python, JavaScript, or similar) + 1 PM for validation
- Full migration with attachments and HTML sanitization: 1–2 developers + 1 PM
Using Power Automate as an Export Channel
Integrate Desk365 with in-house or third-party apps and services using the Desk365 API/Webhook or using the Desk365 Power Automate connector.
The Desk365 Power Automate connector supports triggers (ticket created, updated, note added, reply added) and actions (create, update, get ticket). The connector provides an action to get all tickets, and you can customize your query based on filters.
Power Automate is useful for real-time sync scenarios — forwarding new tickets to a secondary system, appending notes to a SharePoint list — but it is not designed for bulk historical exports. The connector processes one event at a time and does not support offset-based pagination for historical data retrieval.
Desk365 also supports outbound webhooks, which can push event payloads to external endpoints when tickets are created or updated. This is useful for real-time data forwarding (e.g., to a data warehouse or logging service) but does not cover historical data and cannot replace API-based bulk extraction.
[For PMs] If you're already in the Microsoft 365 ecosystem, Power Automate can bridge Desk365 to SharePoint, Excel Online, or Dynamics 365 for ongoing data flows. For a one-time full export, use the REST API directly.
When to Bring In Help
For teams with fewer than 5,000 tickets and no attachment requirements, the native CSV export is usually sufficient for reporting and basic backups. For datasets above 10,000 tickets, or when you need conversations, attachments, and knowledge base content preserved with full fidelity, the API is the only path — and it requires someone comfortable writing pagination logic, handling rate limits, sanitizing Microsoft HTML, and validating data integrity.
Disclosure: ClonePartner is a data migration service provider. We have a commercial interest in this topic. The technical content in this guide is based on Desk365's publicly documented API (v3) and native export features, supplemented by operational experience with the platform.
If you'd rather not build and maintain export scripts, we handle the full extraction and deliver validated, import-ready data. For comparison of portability patterns across helpdesks, see our Freshdesk export guide and Zoho Desk export guide.
Frequently Asked Questions
- Can I export all my data from Desk365?
- You can export most operational data — tickets, contacts, companies, conversations, time entries, knowledge base articles, surveys, and contracts — using a combination of the native CSV export and the REST API v3. Automation rules, SLA configurations, custom views, macros, and role permissions are not exportable through any method and must be manually recreated.
- Does Desk365 export include attachments?
- Native CSV exports do not include attachments. The API's conversations endpoint returns attachment metadata (filename, size, MIME type) and a download URL for each file. You must download each attachment individually — there is no bulk attachment export endpoint.
- What are the Desk365 API rate limits?
- The Standard plan allows 100 API calls per hour. The Plus and Premium plans allow 50 API calls per minute. You can retrieve up to 100 tickets per call, with a maximum of 10,000 ticket records per hour.
- How long does it take to export data from Desk365?
- A native CSV export of ticket metadata typically completes within minutes for datasets under 10,000 records. A full API export with conversations and attachments for 10,000 tickets takes 2-4 hours on Plus/Premium plans, or multiple days on the Standard plan due to its 100 calls/hour limit.
- Can I export Desk365 data for GDPR compliance?
- Desk365 supports GDPR data portability through its CSV and JSON export capabilities. To fulfill a data-subject access request, use the API to filter tickets and conversations by the contact's email address. There is no single-click 'export all data for this person' feature — DSAR fulfillment requires some scripting.

