Skip to content

How to Export Data from HappyFox: Methods, API Limits & Gaps

Complete guide to exporting data from HappyFox. Covers UI CSV limits, REST API v1.1 rate limits, the 10-minute lockout, and what data you cannot get out.

Wahab Wahab · · 19 min read
How to Export Data from HappyFox: Methods, API Limits & Gaps
TALK TO AN ENGINEER

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 HappyFox: Methods, API Limits & Gaps

Info

TL;DR: Exporting Data from HappyFox

HappyFox gives you two extraction paths: a UI-based CSV/XLSX export (Reports → Exports) and the REST API (v1.1). The UI export is fast to set up but only captures the initial ticket message and subject line — staff replies, client replies, and private notes are excluded. For full conversation history, you must use the API. The API enforces 500 GET requests per minute and 300 POST requests per minute, with a 10-minute lockout when you hit a 429 error. Ticket pagination maxes out at 50 records per page. Attachment URLs in API responses expire after 5 minutes. Smart Rules, SLAs, Canned Actions, and satisfaction survey configurations cannot be exported at all. There is no single one-click full account export. There is no bulk ZIP export endpoint. There is no confirmed v2 API or GraphQL interface as of the time of writing.

API behaviors verified against HappyFox API v1.1 documentation and HappyFox Support KB. (support.happyfox.com)

Extracting data from HappyFox is rarely a simple click-and-download operation. Whether you are archiving support records, piping data into a warehouse, or preparing for a full help desk migration, you will find that HappyFox splits exportability across Reports, module-level exports, a read-only Reports API, and the core Help Desk API. The method you choose determines whether you retain your complete customer conversation history or just a flat summary of ticket fields.

This guide covers both export paths, the hard constraints of the API, what incremental sync looks like, and everything you cannot get out at all.

What Data Can You Actually Export from HappyFox?

HappyFox is a ticket-centric help desk. Its data model organizes everything around tickets — each with a conversation thread of staff replies, client replies, and private notes — plus contacts, contact groups, categories, custom fields, tags, attachments, and knowledge base articles.

Not all of this is equally portable:

Data Type UI Export (CSV/XLSX) API (v1.1) Notes
Ticket metadata (subject, status, priority, assignee, timestamps) Both methods work
Initial ticket message (body text) Included in UI export
Staff replies UI export excludes these
Client replies UI export excludes these
Private notes UI export excludes these
Attachments URLs expire after 5 minutes
Contacts API returns 50 per page
Contact groups API only
Custom fields (ticket & contact) ✅ (selected fields) Must select fields in UI export
Knowledge Base articles ✅ (CSV) Limited Published only; drafts excluded
Assets Pro plan and above
Tags ✅ (as ticket field) Included in ticket payload
Smart Rules / Automations Must be rebuilt manually
SLAs Must be rebuilt manually
Canned Actions Must be rebuilt manually
Satisfaction survey config Must be rebuilt manually
Webhooks / event streams No bulk export path; webhooks are outbound-only
Warning

The single biggest portability gap: HappyFox's native CSV export only captures the initial ticket message and subject line. Staff replies, client replies, and private notes are not included. HappyFox confirms this directly in their support documentation. If conversation history matters — and it almost always does — you must use the API. (support.happyfox.com)

Method 1: Native CSV/XLSX Export (Reports → Exports)

What it is: A built-in export tool in the HappyFox admin UI under Reports → Exports. It generates downloadable CSV or XLSX files from filtered ticket data.

When to use it: Quick audits, lightweight reporting, contact backups, or seed data for proof-of-concept migrations where conversation history is not required.

How to Export Tickets via the UI

  1. Navigate to Reports → Exports from the module switcher.
  2. Click the "+" button to create a new export.
  3. Choose a date range and filter type: Created time, Resolved time, or Updated time.
  4. Click "Additional Filter" to refine by ticket status, assigned agent, priority, tags, or category.
  5. Select the ticket fields and contact fields to include. HappyFox does not include all fields by default — you must explicitly choose them.
  6. Enable "Strip Newlines from Text Values" if you plan to open the file in Excel (prevents formatting issues from tabs and extra whitespace).
  7. Choose .xlsx or .csv and click Export.
  8. The export appears under "My Ongoing Exports." Once complete, a download link is emailed to the agent who initiated it. (support.happyfox.com)

UI Export Limitations

  • No conversation threads. Only the initial message and subject. No staff replies, no client replies, no private notes.
  • Export links are agent-exclusive. The download link cannot be shared with or accessed by other team members.
  • Export links expire. Standard report export links expire within 3 days. Contact Portal export links expire within 48 hours.
  • Excel hyperlink limit. Excel caps at 65,530 hyperlinks per sheet. Exports exceeding this show empty cells. Filter by smaller date ranges to work around it.
  • Up to 15 filter conditions can be applied simultaneously.
  • Permission required. Your agent role must have the "Export reports" managerial permission enabled. If the export option is missing, check Manage → Roles and Permissions. (support.happyfox.com)

Exporting Knowledge Base Articles

KB articles can be exported to CSV from the Knowledge Base → Articles module:

  1. Navigate to Knowledge Base → Articles.
  2. Select the article type: External Articles, Internal Articles, or Contact Group Articles.
  3. Click the Export icon.

Only published articles are included. Drafts are excluded from all KB exports. Agents must have the "Manage Knowledge Base Sections and Articles" permission. To export articles from categories outside your assignment, you also need "View KB sections & articles of unassociated categories." (support.happyfox.com)

The exported CSV includes Article ID, Title, Section Name, Content, Tags, Views, Usefulness, and language.

Exporting Contacts

Contacts can be exported from the Contacts list page or via the Reports module to CSV or XLS. This is available on all HappyFox pricing plans.

The API is more complete: it returns contacts 50 at a time via /api/1.1/json/users/?size=50&page=<n> and includes contact group associations and custom field values the UI export may omit. (support.happyfox.com)

Method 2: HappyFox REST API (v1.1) — Full Data Extraction

What it is: A RESTful web service that ships with all HappyFox help desk instances. This is the only path to a complete, migration-ready dataset with full conversation threads, attachments, and the relational links between tickets, contacts, and contact groups needed to reconstruct your help desk elsewhere.

When to use it: Any time you need staff replies, client replies, private notes, attachments, or structured relational data.

API version context: HappyFox currently publishes v1.1 of its Help Desk REST API. There is no confirmed v2 or GraphQL interface. All endpoints use the /api/1.1/json/ path prefix. The API is JSON-only; there is no XML response format.

Enabling API Access and Authentication

API access may be disabled by default on newer HappyFox accounts. To enable it:

  1. Go to Main Menu → Apps → Goodies → API.
  2. Click "Enable this app".
  3. Click "Add New API key", provide a name, and save.
  4. Click "See Auth Code" to retrieve your API Key and Auth Code pair. (support.happyfox.com)

Authentication uses HTTP Basic Auth — the API Key is the username, the Auth Code is the password. All timestamps in API responses are returned in UTC in ISO 8601 format (e.g., 2024-03-15T14:30:00Z). EU-hosted accounts use the .happyfox.net domain rather than .happyfox.com.

import requests
 
url = "https://<subdomain>.happyfox.com/api/1.1/json/tickets/?size=50&page=1"
auth = ("<api_key>", "<auth_code>")
response = requests.get(url, auth=auth)
tickets = response.json()

Key API Endpoints for Data Export

Endpoint Method Purpose
/api/1.1/json/tickets/?size=50&page=<n> GET Paginated ticket list
/api/1.1/json/ticket/<ticket_number>/ GET Single ticket with full thread
/api/1.1/json/users/?size=50&page=<n> GET Paginated contacts list
/api/1.1/json/staff/ GET All staff members
/api/1.1/json/categories/ GET All ticket categories
/api/1.1/json/contact_groups/ GET All contact groups (organizations)
/api/1.1/json/ticket_custom_fields/ GET Ticket custom field definitions
/api/1.1/json/user_custom_fields/ GET Contact custom field definitions
/api/1.1/json/reports/ GET List of saved reports
/api/1.1/json/report/<id>/tabulardata/?size=50&page=<n> GET Tabular report data
/api/1.1/json/assets/?asset_type=<id>&size=50&page=<n> GET Asset records by type

API Rate Limits, Error Responses, and the 10-Minute Lockout

This is where most extraction scripts break.

Limit Type Threshold
GET requests 500 per minute
POST requests 300 per minute
Lockout on 429 10 minutes
Ticket list page size Max 50 per request
Contacts page size Max 50 per request (min 10)
Report tabular data page size Max 50 per request

What a 429 response looks like: When you exceed the rate limit, HappyFox returns HTTP 429 with a JSON body indicating the rate limit has been exceeded. The response does not include a Retry-After header with a specific delay value — you cannot parse the cooldown duration from the response itself. You must implement your own fixed 10-minute (600-second) sleep in code, plus a buffer. (support.happyfox.com)

Unlike APIs that use sliding windows or token buckets with short cooldowns (Zendesk uses a 1-minute window; Freshdesk uses a per-plan per-minute quota with Retry-After headers), HappyFox imposes a flat 10-minute cooldown. One burst past 500 GET/min means your script sits idle for 10 full minutes. If your script continues to poll the API during the lockout, the penalty period may extend.

Danger

The 10-minute lockout is the real killer. Build conservative throttling and exponential backoff into your extraction code. We recommend staying at ~400 GET requests per minute to maintain a safety margin. A single burst can cost you 10 minutes of dead time — repeatedly. Because there is no Retry-After header, your retry logic must hard-code the 605-second sleep (600s + 5s buffer).

Extraction Math: How Long Will It Take?

The typical extraction pattern is a two-pass approach:

Pass 1 — List tickets: Paginate through /api/1.1/json/tickets/?size=50&page=<n> to get all ticket IDs and metadata. For 20,000 tickets at 50 per page, that is 400 GET requests — under 1 minute at full rate.

Pass 2 — Fetch full threads: Hit /api/1.1/json/ticket/<ticket_number>/ for each ticket to get the complete conversation. For 20,000 tickets, that is 20,000 individual GET requests.

At a safe rate of 400 GET/min, Pass 2 takes ~50 minutes for API calls alone. Factor in response parsing, file writes, and retries, and a realistic estimate is 60–90 minutes for 20,000 tickets.

Ticket Count Est. API Calls (Pass 2) Est. Time at 400 GET/min
5,000 5,000 ~15 min
20,000 20,000 ~60–90 min
50,000 50,000 ~2.5–4 hours
100,000 100,000 ~5–8 hours

These estimates exclude attachment downloads. If your tickets average 2–3 attachments each, the download volume can double or triple total extraction time depending on file sizes and network throughput. There is no confirmed hard cap on pagination depth (e.g., no documented maximum page number), but very deep pagination at 50 records/page means large accounts may need to split extraction by date range to keep individual runs manageable.

Incremental Export: Delta Pulls vs. Full Extraction

For ongoing sync (rather than a one-time migration), you do not need to re-pull all tickets on every run. HappyFox's API supports incremental filtering on several endpoints:

  • Tickets: Use the q parameter with last-modified-on-or-after:<date> to retrieve only tickets updated since your last extraction run. Format: yyyy/mm/dd.
  • Contacts: The /api/1.1/json/users/ endpoint accepts updated_since and created_since query parameters for delta pulls.
  • Reports API: Supports period_start and period_end parameters for time-bounded data pulls.

A practical incremental pattern: store the timestamp of your last successful extraction run, then query last-modified-on-or-after:<last_run_date> on the next run. This reduces API call volume dramatically for ongoing sync. The tradeoff is that you must handle tickets that were modified multiple times between runs (deduplication by ticket ID before upsert).

Webhooks are not a substitute for polling. HappyFox supports outbound webhooks that fire on ticket events (create, update, status change). However, webhooks deliver individual event payloads in real time — they are not a batch export mechanism and do not provide historical data. They are useful for keeping a secondary system current after an initial full extraction, but cannot replace the API polling approach for initial migration or bulk export.

Extracting Full Ticket Threads: The N+1 Problem

The ticket list endpoint (/api/1.1/json/tickets/) returns metadata but not the full conversation thread. To extract complete communication history for a ticket, you must query the individual ticket detail endpoint: /api/1.1/json/ticket/<ticket_number>/.

This is a classic N+1 query problem. If your help desk has 100,000 tickets, you need 100,000 separate GET requests just for thread data.

Pagination with Rate Limiting

import requests
import time
 
BASE_URL = "https://<subdomain>.happyfox.com/api/1.1/json"
AUTH = ("<api_key>", "<auth_code>")
 
def extract_all_ticket_ids():
    page = 1
    size = 50
    all_tickets = []
    
    while True:
        url = f"{BASE_URL}/tickets/?page={page}&size={size}"
        response = requests.get(url, auth=AUTH)
        
        if response.status_code == 429:
            print("Rate limit hit. Sleeping for 605 seconds (10 min + buffer)...")
            time.sleep(605)  # HappyFox does not return Retry-After header
            continue  # Retry the same page
            
        response.raise_for_status()
        data = response.json()
        
        if not data.get('data'):
            break
            
        all_tickets.extend(data['data'])
        page += 1
        time.sleep(0.15)  # ~400 req/min
        
    return all_tickets

Parsing the Updates Array

When you query an individual ticket, HappyFox returns an updates array containing every interaction on the ticket, sorted chronologically. Each update object includes:

  • The message body (HTML)
  • The author information
  • A created_at timestamp in ISO 8601 format, UTC
  • An update_type field with one of three values:
    • update — standard reply from client or staff
    • private_note — internal note visible only to agents
    • forward — message forwarded to an external party
  • Attachment metadata with download URLs

Valid ticket status values for API queries include: open, pending, resolved, closed. Use status=_all to retrieve tickets regardless of status — this is necessary for complete extraction, since the default may exclude resolved or closed tickets depending on your account configuration. (support.happyfox.com)

If you need the history of custom field changes on a ticket, pass show_cf_changes=true in your ticket detail request.

Preserving original created_at timestamps is critical if you are migrating to another platform. See our guide on How to Migrate from HappyFox to Freshdesk for specific timestamp and field mapping strategies.

API Query Syntax Details

Time-based search filters use the yyyy/mm/dd format. Multiple search clauses can be combined with the + operator. Tags are case-sensitive, and assignee or group matching is exact-match. (support.happyfox.com)

curl -u $HF_API_KEY:$HF_AUTH_CODE \
  'https://<account>.happyfox.com/api/1.1/json/tickets/?status=_all&size=50&page=1&q=last-modified-on-or-after:%222026/08/01%22+last-modified-before:%222026/08/12%22'

One small gotcha: API field IDs are not the same as what you see in portal URLs. HappyFox's docs explicitly say to fetch ticket and user custom field IDs from /ticket_custom_fields/ and /user_custom_fields/, not by copying IDs from the agent portal. (support.happyfox.com)

Using the Reports API for Pre-Filtered Data

The Reports API at /api/1.1/json/report/<id>/tabulardata/ mirrors the Tabular View in the HappyFox UI. It supports pagination (max 50 per page), sorting via sort_key and sort_dir, and date filtering via period_start, period_end, and period_type parameters. This is useful for pulling pre-filtered datasets or aggregated metrics (staff activity, SLA performance) without building your own filter logic — but it is read-only and not suited for full thread extraction. (support.happyfox.com)

Handling Attachments

Ticket attachments are returned as metadata within the ticket detail response. The API provides download URLs inside the message.attachments array for each update.

The critical constraint: those attachment URLs expire after 5 minutes, with embedded one-time authentication codes. You cannot store the raw URL for later use — your pipeline must download binaries immediately or hand them off to a tight worker queue.

Tip

Batch your attachment downloads. Don't download attachments inline with ticket extraction. First, extract all ticket data and collect attachment URLs. Then run a separate attachment download pass with its own rate-limiting and retry logic. This keeps your primary extraction clean and lets you retry failed downloads independently. The catch: you must process that download queue quickly, before the 5-minute URL expiry window closes. This means your worker queue must begin processing immediately after ticket extraction — not hours later.

For teams with heavy attachment use (screenshots, PDFs, logs), attachment download volume can exceed ticket data volume by 10x or more. A mid-size help desk can easily contain 50–100GB of historical attachments. Attachment downloads do not count against the API rate limit in the same way as JSON endpoint calls, but they are subject to network throughput constraints and should be parallelized with care to avoid overwhelming the connection pool.

Extracting Contacts and Organizations

Tickets belong to Contacts (users) and Contact Groups (organizations). You must extract this relational data to reconstruct your help desk elsewhere — without it, tickets in your target system will lack their company and user associations.

Contacts: Query /api/1.1/json/users/?size=50&page=<n> to extract all contacts and staff. Use the is_staff boolean flag to differentiate agents from customers. The endpoint supports incremental filtering via updated_since and created_since parameters, plus search by name, email, and phone. Small gotcha from the docs: when searching by phone, omit the leading + in the query value. (support.happyfox.com)

Contact Groups: Query /api/1.1/json/contact_groups/ to extract organizations. Build a mapping table linking user_id to contact_group_id so you can maintain company-level ticket associations in your target system.

Staff: Query /api/1.1/json/staff/ to extract all staff members as a separate dataset.

HappyFox Chat: A Separate Export Path

If your HappyFox account includes HappyFox Chat, that is a separate product with its own API and data store. Chat transcripts are not available through the Help Desk API.

The HappyFox Chat API (api.happyfoxchat.com/v1) has different constraints:

  • Rate limit: 100 requests per minute
  • Pagination: Max 30 records per page (default 10)
  • Auth: Bearer token (not Basic Auth)
  • Transcripts endpoint: /v1/transcripts?page=<n>&limit=<n>

Chat report CSV exports from the UI have a 15-minute cooldown — you cannot re-export the same date range within 15 minutes. If you are migrating both Help Desk and Chat data, plan these as two independent extraction pipelines with separate authentication, separate rate-limit budgets, and separate validation counts.

What You Cannot Export

Several HappyFox configuration objects have no export path at all — neither UI nor API. This is not a gap that will be filled by deeper API exploration; these objects are simply not exposed as exportable data:

  • Smart Rules (automation rules)
  • SLA policies
  • Canned Actions (templated responses)
  • Satisfaction survey configurations
  • Workflow automations
  • Custom Views (agent-specific dashboard views and ticket queues)
  • Bulk ZIP export — HappyFox has no endpoint that returns a compressed archive of all account data

The practical move: before starting any migration, screenshot or document every Smart Rule, SLA policy, and Canned Action in your HappyFox instance. There is no shortcut. Budget time to manually recreate these in your target platform.

Warning

Do not confuse export with backup. HappyFox's daily backups are used for restoration if needed, not as a customer-facing export of your account data. If you need a portable dataset you can validate, transform, or import elsewhere, plan an explicit export job. (support.happyfox.com)

Data Residency and GDPR Considerations

EU-hosted HappyFox accounts use the .happyfox.net domain rather than .happyfox.com. All API endpoints remain structurally identical — substitute the domain accordingly in every request. This matters for GDPR compliance: if you are extracting data from an EU-hosted account and storing it in a non-EU system, your organization is responsible for ensuring the transfer meets applicable data transfer requirements (Standard Contractual Clauses or equivalent). HappyFox does not perform the transfer compliance check on your behalf. Exported data that includes personal information (names, email addresses, ticket content) is subject to GDPR Article 20 (data portability) and should be handled accordingly throughout the extraction pipeline.

Common Export Pitfalls

Assuming the CSV export has everything. Teams export via the UI, see a clean spreadsheet, and assume they have complete data. They discover missing replies only after loading into the target system. Always verify that your export method captures the full conversation thread before committing to a migration path.

Ignoring the 10-minute lockout. Most rate-limit implementations use sliding windows or return Retry-After headers with short delays. HappyFox's 10-minute lockout is a blunt instrument with no Retry-After header. A single burst costs you 10 minutes of dead time — and it compounds if your script doesn't back off properly. Hard-code a 605-second sleep on any 429 response.

Not handling pagination exhaustion. If you don't check page counts and iterate until the last page, you will silently miss tickets. Always validate your extracted ticket count against the total shown in HappyFox's UI.

Forgetting status=_all. The default ticket list API response may not include resolved or closed tickets. Always pass status=_all for complete extraction, or explicitly enumerate open, pending, resolved, closed in separate queries.

Forgetting about attachments. Ticket detail endpoints return attachment metadata, but files must be downloaded separately — and the URLs expire in 5 minutes. Skipped attachments mean broken references in your target system.

Missing draft KB articles. KB exports only include published articles. If your team uses drafts as a staging mechanism, those articles will not appear in any export. Publish or archive drafts before exporting if you need them in the target.

Confusing API field IDs with portal IDs. HappyFox's API docs say to fetch custom field IDs from the dedicated endpoints (/ticket_custom_fields/, /user_custom_fields/), not by copying IDs from the agent portal URL. This misalignment has broken more than a few extraction scripts.

Not running incremental pulls for long migrations. If your extraction spans multiple days (common for 50K+ ticket accounts), tickets can be updated during extraction. Use last-modified-on-or-after on a final reconciliation pass to catch any tickets modified since your initial pull started.

HappyFox Export Compared to Other Platforms

Most help desks make native exports look broader than they really are. HappyFox is not alone, but it is firmly in the group where migration-grade exports are API-led.

Platform Native Export Behavior API Rate Limit What You Still Need the API For
HappyFox CSV/XLSX ticket data, excludes replies and private notes (support.happyfox.com) 500 GET/min; 10-min lockout on breach; no Retry-After Full thread history, attachment handling, structured contacts
Zendesk JSON, CSV, or XML admin export; CSV omits comments (support.zendesk.com) 400 requests/min (varies by plan); Retry-After header returned Full event and comment exports at scale, attachment retrieval
Freshdesk Ticket CSV/Excel; excludes full conversations and archived tickets (support.freshdesk.com) Varies by plan (e.g., 1000/min on Enterprise); Retry-After header returned Full content and history, archived data workflows
Help Scout Report exports exclude conversation thread contents (docs.helpscout.com) 200 requests/min Full conversation data and Docs content retrieval

The most significant difference between HappyFox and Zendesk/Freshdesk at extraction time is the rate limit recovery mechanism. Both Zendesk and Freshdesk return Retry-After headers that allow scripts to adapt dynamically. HappyFox's fixed 10-minute lockout without a header forces a hard-coded sleep — which means any burst, even a brief one, has a disproportionate penalty on total extraction time.

Migration-Ready Export Checklist

If you are exporting HappyFox data specifically for a migration, the extraction is only half the problem. Every help desk has a different data model — HappyFox Categories do not map 1:1 to groups or departments in most other platforms, Statuses are configurable per account, and custom fields require schema mapping with type recreation (dropdown, text, checkbox, date) in the target.

  1. Pull metadata first. Export categories, staff, ticket custom fields, and contact custom fields before touching tickets. This prevents broken mappings later.
  2. Run a small sample. Compare 20–50 tickets in the HappyFox UI against your raw API output to catch missing replies, bad filters, or wrong field IDs early.
  3. Use status=_all. Ensure your ticket list query includes resolved and closed tickets, not just open ones.
  4. Decide on field-change history. If auditability matters, include show_cf_changes=true in ticket detail pulls. (support.happyfox.com)
  5. Download attachments immediately. The 5-minute URL expiry is short enough to break lazy pipelines. Your attachment worker queue must start processing before ticket extraction completes.
  6. Export each data type separately. Tickets, contacts, KB articles, and reports live behind different modules and endpoints. Your validation plan needs separate counts for each.
  7. Keep both raw and normalized output. Store untouched source payloads alongside mapped data so you can re-check edge cases without re-pulling from production.
  8. Run a reconciliation pass. After full extraction, run one more incremental pull using last-modified-on-or-after:<extraction_start_date> to catch tickets updated during the extraction window.
  9. Validate counts. Compare extracted ticket, contact, and KB article counts against the totals in HappyFox's UI. (support.happyfox.com)
  10. Document all Smart Rules, SLAs, and Canned Actions manually. There is no API or export for these — screenshot them now, before you lose access.

We have published detailed migration guides for the most common HappyFox migration paths:

When DIY Export Works (And When It Doesn't)

DIY is viable when:

  • Your dataset is under ~5,000 tickets (Pass 2 completes in ~15 minutes at 400 GET/min, leaving little margin for error but manageable retry loops)
  • You have a developer comfortable writing Python or Node.js scripts
  • Conversation history is optional (UI export is sufficient)
  • You have 2–4 weeks of engineering time available
  • The target system has a well-documented import API

DIY gets risky when:

  • Your dataset exceeds 20,000 tickets with full conversation threads (at this scale, a single rate-limit lockout mid-extraction loses 10 minutes per incident; multiple incidents across a multi-hour run compound quickly)
  • You need zero-downtime cutover with a reconciliation pass
  • Attachments are heavy (average >2 per ticket, or total attachment store >10GB)
  • Custom field mapping is complex (10+ custom fields, dependent dropdowns, or multi-select fields requiring type transformation)
  • You are migrating HappyFox Help Desk and HappyFox Chat simultaneously (separate APIs, separate auth, separate rate limits)
  • You cannot afford a failed migration attempt that damages data integrity in the target system

The Bottom Line on HappyFox Data Portability

HappyFox's data portability is functional but has sharp edges. The UI export is convenient for reporting but fundamentally incomplete for migration — the missing conversation history is a hard limitation that affects every team moving off the platform. The API fills the gap, but the 50-record page size, 5-minute attachment URL expiry, 10-minute lockout penalty, and absence of a Retry-After header make large-scale extraction slower and more fragile than comparable platforms like Zendesk or Freshdesk.

The most reliable approach: use the API for tickets (full threads, status=_all), contacts, and custom fields. Use the UI export for KB articles (published only). Use webhooks only for post-migration incremental sync, not for initial extraction. Manually document Smart Rules, SLAs, and Canned Actions. Always run a count validation at the end — compare what you extracted against what HappyFox shows in its UI.

Frequently Asked Questions

Does HappyFox CSV export include ticket replies and private notes?
No. HappyFox's native CSV/XLSX export from Reports → Exports only includes the initial ticket message and subject line. Staff replies, client replies, and private notes are excluded. You must use the HappyFox REST API (v1.1) to extract full conversation history.
What are the HappyFox API rate limits?
HappyFox enforces 500 GET requests per minute and 300 POST requests per minute. Exceeding these limits triggers a 429 HTTP error with a 10-minute lockout. Ticket and contact pagination is capped at 50 records per page.
How do I export knowledge base articles from HappyFox?
Navigate to Knowledge Base → Articles, select the article type (External, Internal, or Contact Group), and click the Export icon. Only published articles are exported — drafts are excluded. You need the 'Manage Knowledge Base Sections and Articles' permission.
Can I export Smart Rules, SLAs, and Canned Actions from HappyFox?
No. HappyFox does not provide any export mechanism — UI or API — for Smart Rules, SLA policies, Canned Actions, or satisfaction survey configurations. These must be manually documented and rebuilt in your target system.
How long does it take to export all tickets from HappyFox via API?
At a conservative rate of 400 GET requests per minute, extracting 20,000 tickets with full conversation threads takes approximately 60–90 minutes. 50K tickets takes 2.5–4 hours, and 100K tickets takes 5–8 hours. Attachment downloads can double or triple these times.

More from our Blog