---
title: "How to Export Data from Kustomer: Methods, API Limits & Data Portability"
slug: how-to-export-data-from-kustomer-methods-api-limits-data-portability
date: 2026-07-13
author: Nachi
categories: [Kustomer]
excerpt: "Complete guide to exporting data from Kustomer. Covers native UI limits, saved search caps, API pagination, rate limits, archive search, and what data you can't export."
tldr: No single Kustomer export tool covers everything. Native exports cap at 30 days and 50K rows. Full historical extraction requires the REST API with cursor-based pagination and Archive Search.
canonical: https://clonepartner.com/blog/how-to-export-data-from-kustomer-methods-api-limits-data-portability/
---

# How to Export Data from Kustomer: Methods, API Limits & Data Portability


## What Data Can You Export from Kustomer?

Kustomer's data model centers on **Customers**, **Companies**, **Conversations**, **Messages**, **Notes**, **Events**, and **Custom Objects (KObjects)**. Operational metadata lives in **Users**, **Teams**, **Tags**, **Snippets**, **Shortcuts**, and **Knowledge Base Articles**. The exportability of each object depends heavily on the method you use. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

| Object | Native Reporting Export | Saved Search Export | Export Buddy | API Export | Format | Key Limitations |
|---|---|---|---|---|---|---|
| Customers | Yes (30-day window, 25 attrs) | Yes (50K rows) | No | Yes (`GET /v1/customers`) | CSV / JSON | UI limited to 25 attributes; search excludes records not updated in 2 years |
| Companies | No | Yes (50K rows) | No | Yes (`/v1/companies`) | CSV / JSON | No reporting export; search caps apply ([help.kustomer.com](https://help.kustomer.com/en_us/categories/use-search-HJhlfRb8?utm_source=openai)) |
| Conversations | Yes (30-day window) | Yes (50K rows) | No | Yes (`POST /v1/customers/search` with `queryContext: conversation`) | CSV / JSON | CSV gives conversation fields and previews, not full message bodies; search excludes data updated >2 years ago |
| Messages | Yes (preview and subject only) | Partial | No | Yes (`GET /v1/conversations/{id}/messages`) | CSV / JSON | Reporting export exposes `preview` and `subject`, not full body; must be fetched per-conversation via API ([help.kustomer.com](https://help.kustomer.com/en_us/data-export-of-message-standard-attributes-HJSBh2UVj?utm_source=openai)) |
| Notes | Yes (includes `body`) | Partial | No | Yes (`GET /v1/conversations/{id}/notes`) | CSV / JSON | No native bulk search-export path for notes ([help.kustomer.com](https://help.kustomer.com/en_us/data-export-of-note-standard-attributes-rJ4fiiFVi?utm_source=openai)) |
| Events / Audit Logs | No | No | No | Partial (`GET /v1/audit-logs`) | JSON | Retention-bound: some events 90 days, others 12 months ([help.kustomer.com](https://help.kustomer.com/en_us/use-audit-logs-S1Vj88QQN?utm_source=openai)) |
| KObjects (Custom Objects) | No | Partial (50K rows) | No | Yes (`GET /v1/kobjects/{klassName}`) | JSON | Saved search excludes data updated >2 years; complex nested arrays truncated in CSV; Klass schema definitions not exportable ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |
| Users | No | No | Yes | Yes (`GET /v1/users`) | CSV / JSON | Export Buddy includes `deletedAt` and `lastLoginDate`; use API if you need deactivation timestamps reliably ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai)) |
| Teams | No | No | Yes | Yes (`GET /v1/teams`) | CSV / JSON | Export Buddy gives team metadata, not conversation history |
| Tags | No | No | Yes | Yes | CSV / JSON | Tag usage history lives in events/audit logs, not Export Buddy |
| Snippets | No | No | Yes | Yes | CSV / JSON | Export Buddy includes soft-deleted snippets; filter `deletedAt` via API for active only ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai)) |
| Shortcuts | No | No | Yes | Yes | CSV / JSON | Destination systems usually need manual remapping of shortcut behavior |
| KB Articles | No | No | Yes (ZIP) | Yes (`GET /v1/articles`) | ZIP / JSON | Export Buddy downloads as ZIP with `htmlBody`; API content is HTML in `attributes.body` ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai)) |
| Attachments | No | No | No | Yes (per-conversation) | Binary | Must be downloaded individually; no bulk export endpoint |
| Business Rules / Workflows | No | No | No | **No** | — | Not exportable through any method ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |
| Routing Queue Settings | No | No | No | **No** | — | Not exportable |
| Conversational Assistants | No | No | No | **No** | — | Not exportable |
| Saved Search Definitions | No | No | No | **No** | — | Results exportable; definitions are not |
| Custom Klass Schema Definitions | No | No | No | **No** | — | Must be manually rebuilt ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |

**Summary:** Fully exportable with API — customers, conversations, messages, notes, users, teams, KB articles, and most KObjects. Partially exportable — companies, events/audit data, attachments. Not exportable through any supported method — business rules, workflows, saved search definitions, custom Klass schema definitions, conversational assistant configurations, and routing queue settings. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

> [!WARNING]
> **Native CSVs are not transcript exports.** Conversation CSVs export conversation-level fields and message previews, not full message bodies. The reporting export for Messages exposes `preview` and `subject` — not the complete transcript. Notes export does include `body`, and KB export surfaces `htmlBody`. If you need destination-ready conversation history, use the API and preserve IDs and relationships. ([help.kustomer.com](https://help.kustomer.com/en_us/data-export-of-message-standard-attributes-HJSBh2UVj?utm_source=openai))

## Export Methods: Every Way to Get Data Out of Kustomer

There are five practical paths to extract data from Kustomer. Your choice depends on data volume, the age of your records, your Kustomer plan tier, and available engineering resources. Only one of them — the API — is suitable for a full historical export without the UI caps. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

| Method | Data Coverage | Volume Limit | Speed | Complexity | Plan Requirement | Best For |
|---|---|---|---|---|---|---|
| **Native Reporting Export** | Conversations, Customers, Messages, Notes (25 attrs max) | 30-day window | Minutes | Low | All plans | Quick operational reporting |
| **Export Buddy** | Users, Teams, Snippets, Shortcuts, Tags, KB Articles | Full (for supported objects) | Seconds to minutes | Low | All plans (admin role required) | Pre-migration config backup |
| **Saved Search Export** | Any searchable object | 50,000 rows; no data >2 years old | Minutes | Low | Enterprise or Ultimate only | Segmented data pulls, small recent datasets |
| **REST API** | All record-level objects including KObjects and attachments | Unlimited (with pagination workarounds) | Hours to days | High | All plans (rate limits vary by tier) | Full migrations, backups, compliance |
| **Managed Export Service** | All objects with relationship preservation | Unlimited | Days | Low (for you) | N/A | Enterprise migration, zero internal engineering |

A sixth option exists for analytics and warehousing: **third-party ETL connectors** such as Fivetran's Kustomer connector, which incrementally syncs conversations, customers, KObjects, messages, notes, and work sessions into a warehouse. These connectors sync metadata like `MESSAGE_ATTACHMENT` details but do not export the binary attachment files themselves and are not suited for platform-to-platform migration. ([fivetran.com](https://fivetran.com/docs/connectors/applications/kustomer?utm_source=openai))

### Method 1: Native Reporting Data Export (Best for Recent Data)

Kustomer's **Reporting Data Export** is the simplest self-serve option — and the most constrained. It exports Conversation, Conversation Views (Handle Time), Customer, Message, and Note objects to CSV. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/export-your-data-H1X6zdrVs?utm_source=openai))

**How to run a reporting export:**
1. Navigate to **Reporting** > **Data Exports** in the Kustomer sidebar and click **Add Export**. Kustomer sends the final CSV as an emailed download link. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/export-your-data-H1X6zdrVs?utm_source=openai))
2. Select the object type: Conversation, Conversation Views, Customer, Message, or Note. Companies, Events, and KObjects are not available through this method.
3. Set the date range. The UI supports preset windows — **Current Day**, **Past 30 Minutes**, **Past 60 Minutes**, **Past 24 Hours**, **Past 7 Days**, and **Past 30 Days** — depending on whether the export is one-time or scheduled. The date window applies to **`createdAt`**, and the default timezone is **EST** (configurable). ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))
4. Select up to **25 attributes** per export. Kustomer uses API/system field names for many export fields, so attribute selection takes longer than expected the first time.
5. Choose **Export Now** or schedule it **Daily**, **Weekly**, or **Monthly**. You can add up to **50 recipients** and maintain up to **50 scheduled exports**. ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))

> [!WARNING]
> **The 25-attribute cap is a hard limit.** If your Customer object has 40 custom fields, you need two separate exports stitched together by Kustomer ID. This makes the reporting export impractical for any object with a rich custom schema and entirely unsuitable for migration.

This method requires zero engineering resources. Any admin can run it. But it is designed for operational reporting — not data portability. Kustomer's own documentation recommends starting with narrow ranges if export creation fails and switching to the API for larger exports. ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))

### Method 2: Export Buddy (Best for Metadata & KB Articles)

**Export Buddy** is a first-party Kustomer app for exporting operational metadata — not customer or conversation data. Think of it as a config export, not a data export.

**What it exports:** Users, Teams, Snippets (canned responses), Shortcuts, Conversation Tags, and Knowledge Base Articles.

**How to use it:**
1. Go to **Apps** → **Explore Directory**, search for **Export Buddy**, and install it. Only admins can install. ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai))
2. Open **Apps** > **Export Buddy** from the sidebar.
3. Select the data type you want to export and click **Export**. For KB articles, do not close the active tab while it processes. ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai))
4. Download the file. Users, teams, snippets, shortcuts, and tags download as **CSV**. Knowledge Base articles download as a **compressed ZIP** containing a CSV with fields like `htmlBody`, `slug`, `status`, and `publishedAt`.

**Watch for soft-deleted data.** Export Buddy includes deleted snippets in its CSV output. The docs explicitly state you should filter records with `deletedAt` via the API if you only want active snippets. User exports also include `deletedAt` and `accountStatus` markers — decide what should be migrated versus left behind. ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai))

Export Buddy is the fastest way to back up team structure, canned responses, and knowledge base content. It does not touch customers, conversations, messages, or any transactional data.

### Method 3: Saved Search Export (The 50,000-Row Limit)

Any saved search in Kustomer can be exported to CSV. This is the most flexible native option for segmented data pulls, but it has hard constraints that make it unsuitable for full-scale extraction. **This feature is only available on Enterprise or Ultimate plans.**

**How to export a saved search:**
1. Open the **Searches** panel and select or create a saved search. ([help.kustomer.com](https://help.kustomer.com/en_us/export-search-results-S1aKjUs5kl?utm_source=openai))
2. Click **Export Search** and choose the export properties. For conversation searches, you can include fields like preview columns, but to export individual messages you should export the Message object instead.
3. Enter recipient email addresses and click **Run Export**. Kustomer emails a CSV download link. ([help.kustomer.com](https://help.kustomer.com/en_us/export-search-results-S1aKjUs5kl?utm_source=openai))

**Hard limits:**
- **50,000 rows per export.**
- **Data updated more than 2 years ago is silently excluded** from search results. There is no warning in the UI.
- Only **one export can run at a time** and exports cannot be scheduled.
- Only available on **Enterprise or Ultimate plans**. ([help.kustomer.com](https://help.kustomer.com/en_us/export-search-results-S1aKjUs5kl?utm_source=openai))

> [!CAUTION]
> **The 2-year cutoff is the single biggest data-loss risk for teams using native exports for migration.** If your dataset spans 4 years of history, the oldest 2 years of untouched records simply will not appear in search results. There is no warning. If you rely on saved searches to extract your data, you will permanently lose all history older than 24 months that hasn't been updated.

Conversation search exports do not include all messages within the export. Kustomer's documentation states you must use the API endpoint `GET /v1/conversations/{id}/messages` to retrieve all messages within specific conversations. If you rely solely on the saved search export, you will silently lose message-level detail.

### Method 4: REST API Export (For Engineering Teams)

The Kustomer REST API is the only method that gives you access to your complete dataset — records older than 2 years, full message bodies, attachments, KObjects, and relational data. It is also the only path that cleanly bypasses the 30-day reporting cap and the 50K saved search cap. ([help.kustomer.com](https://help.kustomer.com/api-introduction-BkwVN42zM?utm_source=openai))

#### Authentication and Permissions

All API requests authenticate via a **Bearer token** in the `Authorization` header:

```
Authorization: Bearer kustomer_api_key_here
```

API keys are managed in **Settings → Security → API Keys**. Assign an API role with read permissions for the objects you need. Kustomer documents common read permissions as `org.user.customer.read`, `org.user.conversation.read`, `org.user.message.read`, `org.user.search.read`, `org.user.team.read`, and `org.user.kobject.read`. ([help.kustomer.com](https://help.kustomer.com/api-introduction-BkwVN42zM?utm_source=openai))

The base URL is `https://{orgname}.api.kustomerapp.com` for US-hosted instances. For EU-hosted instances, use the `api.prod2` domain extension. Rate limits, Archive Search behavior, and retention windows follow the same documented specifications regardless of hosting region.

#### Key API Endpoints

| Object | Endpoint | Method |
|---|---|---|
| Customers | `/v1/customers` | GET |
| Search Customers | `/v1/customers/search` | POST |
| Archive Search (records >2 years) | `/v1/customers/archive/search` | POST |
| Companies | `/v1/companies` | GET |
| Conversations by Customer | `/v1/customers/{id}/conversations` | GET |
| Messages by Conversation | `/v1/conversations/{id}/messages` | GET |
| Notes by Conversation | `/v1/conversations/{id}/notes` | GET |
| Attachments by Conversation | `/v1/conversations/{id}/attachments` | GET |
| Events by Conversation | `/v1/conversations/{id}/events` | GET |
| KObjects by Klass | `/v1/kobjects/{klassName}` | GET |
| KObjects by Customer | `/v1/customers/{customerId}/klasses/{klassName}` | GET |
| KB Articles | `/v1/articles` | GET |
| Users | `/v1/users` | GET |
| Teams | `/v1/teams` | GET |
| Roles | `/v1/roles` | GET |
| Audit Logs | `/v1/audit-logs` | GET |

> [!NOTE]
> **There is no standalone `/v1/conversations/search` endpoint.** To search conversations, use `POST /v1/customers/search` with `queryContext` set to `conversation`, and prefix conversation fields with `conversation_`. Use `POST /v1/customers/archive/search` for data older than two years. Also use `GET /v1/customers/search/fields?queryContext=conversation` when building filters — Kustomer's searchable field list is not obvious from the UI alone. ([help.kustomer.com](https://help.kustomer.com/en_us/kustomer-api-frequently-asked-questions-rJPDs3yAZg?utm_source=openai))

#### Sample API Response: Customer Object

A truncated response from `GET /v1/customers/{id}` illustrates the JSON structure you will work with:

```json
{
  "data": {
    "type": "customer",
    "id": "5abc123def456789ghijk012",
    "attributes": {
      "name": "Jane Doe",
      "email": "jane@example.com",
      "phones": [{"type": "home", "phone": "+15551234567"}],
      "custom": {
        "accountTierStr": "enterprise",
        "lifetimeValueNum": 42500
      },
      "createdAt": "2021-03-15T14:22:31.000Z",
      "updatedAt": "2024-06-01T09:11:02.000Z"
    },
    "relationships": {
      "org": {"data": {"type": "org", "id": "org_id_here"}},
      "conversations": {
        "links": {"self": "/v1/customers/5abc123def456789ghijk012/conversations"}
      }
    }
  }
}
```

Message objects follow a similar pattern, with `attributes.body` containing the full HTML message content, `attributes.preview` containing a truncated plain-text summary, and `attributes.direction` indicating `in` (customer) or `out` (agent).

#### Rate Limits

Kustomer enforces rate limits at multiple levels. The org-wide limit varies by plan:

| Limit Type | Rate | Notes |
|---|---|---|
| Org-wide (Professional) | 300 RPM | Legacy plan |
| Org-wide (Business) | 500 RPM | Legacy plan |
| Org-wide (Enterprise) | 1,000 RPM | Shared across all API keys in the org |
| Org-wide (Ultimate) | 2,000 RPM | Shared across all API keys in the org |
| Machine users (API keys) | 100 RPM | Per key, unless your contract specifies otherwise |
| Search API | 100 RPM | Default for search endpoints |

([help.kustomer.com](https://help.kustomer.com/en_us/general-platform-limits-SkaxdnHLu?utm_source=openai), [help.kustomer.com](https://help.kustomer.com/api-rate-limits-Sk2xoQgYX?utm_source=openai))

When you exceed the limit, the API returns **HTTP 429 Too Many Requests**. Kustomer documents `x-ratelimit-limit` and `x-ratelimit-remaining` in response headers. Their API FAQ recommends exponential backoff. The docs do not promise a universal `Retry-After` contract, so honor it if present and fall back to your own backoff if not.

**Other error codes to handle during bulk extraction:**
- **HTTP 403 Forbidden** — API key lacks the required permission scope. Verify the key's role includes the relevant `org.user.*.read` permission.
- **HTTP 404 Not Found** — The record ID is invalid or the object has been hard-deleted. Log and skip; do not retry.
- **HTTP 500 / 502 / 503** — Transient server errors. Retry with exponential backoff, capped at 3–5 retries per request.

([help.kustomer.com](https://help.kustomer.com/api-rate-limits-Sk2xoQgYX?utm_source=openai))

#### The 100-Page Pagination Limit

Both the Search API and Archive Search endpoints have a **hard limit of 100 pages per query**. Page sizes, defaults, and maximums vary by endpoint — Kustomer's pagination guide says the API reference for each route is the source of truth. ([help.kustomer.com](https://help.kustomer.com/en_us/apis-exports-and-bulk-operations-in-kustomer-SJNnhJlAZx?utm_source=openai))

**The workaround:** Use `updated_at` cursor-based pagination. After processing 100 pages, note the `updatedAt` timestamp from the final record. Submit a new query with an `updated_at` filter starting after that value. Repeat until no more records are returned. ([help.kustomer.com](https://help.kustomer.com/en_us/kustomer-api-frequently-asked-questions-rJPDs3yAZg?utm_source=openai))

#### Retrieving Data Older Than 2 Years (Archive Search)

The standard Search API (`POST /v1/customers/search`) only returns records updated within the past 2 years. To retrieve older records, switch to the **Archive Search endpoint**: `POST /v1/customers/archive/search`.

This endpoint returns all matching records **regardless of when they were last updated** — it is not restricted to only old data. It is subject to the same 100-page limit and requires the same `updated_at` cursor workaround for datasets exceeding the page ceiling. ([help.kustomer.com](https://help.kustomer.com/en_us/kustomer-api-frequently-asked-questions-rJPDs3yAZg?utm_source=openai))

#### Example: Cursor-Based Pagination with Archive Search

```python
import time
import requests

ORG = "yourorg"
API_KEY = "your_api_key"
BASE = f"https://{ORG}.api.kustomerapp.com"
HEADERS = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

def fetch_page(body, page):
    params = {"page": page}
    return requests.post(
        f"{BASE}/v1/customers/archive/search",
        params=params,
        json=body,
        headers=HEADERS,
        timeout=60,
    )

cursor = "2018-01-01T00:00:00.000Z"

while True:
    last_seen = None
    saw_rows = False

    body = {
        "queryContext": "conversation",
        "sort": [{"conversation_updated_at": "asc"}],
        "and": [
            {"conversation_updated_at": {"gte": cursor}}
        ]
    }

    for page in range(1, 101):  # 100-page max
        resp = fetch_page(body, page)

        if resp.status_code == 429:
            wait = int(resp.headers.get("Retry-After", "5"))
            time.sleep(wait)
            resp = fetch_page(body, page)

        if resp.status_code in (500, 502, 503):
            time.sleep(10)
            resp = fetch_page(body, page)

        resp.raise_for_status()
        rows = resp.json().get("data", [])
        if not rows:
            break

        saw_rows = True
        for row in rows:
            process_record(row)  # your export logic here
            last_seen = row["attributes"]["updatedAt"]

    if not saw_rows or not last_seen:
        break

    cursor = last_seen  # restart from last record's timestamp
```

This script uses the Archive Search endpoint to retrieve conversations regardless of age, implements cursor-based pagination to bypass the 100-page limit, handles HTTP 429 rate-limit responses, and retries on transient server errors. Add your own persistence layer to write records to disk or a database as they arrive instead of holding everything in memory.

#### Handling KObject Nested Structures

KObjects frequently contain nested arrays and complex custom fields. When fetching via `GET /v1/kobjects/{klassName}`, the response includes the full nested structure in JSON — unlike CSV exports, which truncate arrays.

**Practical approach for nested KObjects:**

1. **Inspect the Klass schema** by reviewing KObject instances. While Kustomer lists Klass schema definitions as non-exportable, you can infer the schema by fetching a sample set of KObjects for each Klass and cataloging all `attributes.custom.*` field paths, their types, and nesting depth.
2. **Flatten selectively.** For migration, decide which nested arrays to flatten into separate rows (e.g., line items on an order KObject) versus which to keep as serialized JSON in a single column. A common pattern: store the top-level KObject fields as columns and serialize nested arrays as JSON strings in a `_nested_data` column.
3. **Preserve the customer relationship.** KObjects link to customers via `/v1/customers/{customerId}/klasses/{klassName}`. Always extract and store the `customerId` foreign key to maintain the association in the destination system.

#### Throughput Planning Math

At a conservative **80 RPM** against the 100 RPM Search API cap with 100 records per page, you can extract roughly **480,000 records per hour** for flat object listing (customers, conversations).

For message extraction — which requires per-conversation API calls — throughput drops significantly: 100 API calls/min × 1 conversation per call = roughly **6,000 conversations with full message history per hour**, assuming one page of messages per conversation.

Large instances with 500K+ conversations and millions of messages should budget **8–24 hours** of continuous API extraction time. These are planning estimates, not vendor SLAs. Actual throughput depends on payload sizes, network latency, and retry frequency. ([help.kustomer.com](https://help.kustomer.com/api-rate-limits-Sk2xoQgYX?utm_source=openai))

#### Webhook Event Stream (Incremental Sync)

Kustomer supports **webhook-based event streaming** for near-real-time data export. Webhooks can be configured in **Settings → Webhooks** to fire on events such as `customer.create`, `customer.update`, `conversation.create`, `conversation.update`, `message.create`, and `kobject.create`. Each webhook POST delivers a JSON payload containing the full object state at the time of the event.

This is useful for **incremental backup architectures** — pipe events to a queue (SQS, Pub/Sub) and process into a warehouse or backup store. It is **not** a substitute for bulk historical extraction via the API, since webhooks only capture events going forward from the moment of configuration. Kustomer's reporting export documentation references this pattern for continuous export to external systems like Redshift. ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))

## Does Kustomer Export Include Attachments?

No. Kustomer does **not** include attachments in any native CSV, search export, or Export Buddy download. Kustomer's native export documentation does not describe a binary attachment export workflow — attachments are treated as separate resources. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

The practical extraction pattern:

1. **Export conversations and messages first** via the API.
2. **Enumerate attachment metadata** using `GET /v1/conversations/{id}/attachments`, which returns a paginated list including download URLs.
3. **Download each file individually** via its direct URL. Kustomer hosts these files securely and the URLs may expire, so your script must download the binary immediately upon receiving the URL.
4. **Handle inline images** embedded in HTML or Markdown message bodies. These are stored as separate attachment references and must be fetched via the API. Parse `src` URLs from message HTML, download the images, and rewrite message body references if migrating to a new platform. If a shortcut includes an inline image in a channel that does not support inline images, Kustomer sends the image as a URL instead — this matters during post-migration validation. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/work-with-conversations-HJCoEHDqle?utm_source=openai))
5. **Re-associate each file** by message ID, conversation ID, and customer ID in the target system.

There is **no bulk attachment download endpoint**. For a Kustomer instance with 100,000 conversations, you may need 100,000+ API calls just to enumerate attachments, plus additional calls to download each file. At 100 RPM, downloading attachments from a large instance can take **12–48 hours** depending on volume.

Agent-side attachment limits are worth knowing for validation: individual files capped at **5 MB**, total attachment size per message at **9.5 MB**, and inline images at **5 MB each**. Supported file types include `.pdf`, `.doc`, `.docx`, `.xls`, `.xlsx`, `.zip`, `.txt`, `.mov`, `.mp4`, `.png`, `.jpg`, and `.gif`. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/work-with-conversations-HJCoEHDqle?utm_source=openai))

Fivetran's Kustomer connector syncs a `MESSAGE_ATTACHMENT` table with attachment details (file name, content type, size), which is useful for warehouse analytics but is not the same thing as exporting the binary files themselves. ([fivetran.com](https://fivetran.com/docs/connectors/applications/kustomer?utm_source=openai))

## What Data Cannot Be Exported from Kustomer?

Some data types cannot be exported through **any supported method** — native UI, Export Buddy, or API. Kustomer explicitly lists these in its export documentation. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

| Data Type | Exportable? | Workaround |
|---|---|---|
| Business Rules / Automations | **No** | Manually document conditions and actions. Audit logs show change history but not packaged config. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |
| Workflows | **No** | Manually document and rebuild. Audit logs capture some changes but not reusable definitions. |
| Conversational Assistant Configs | **No** | Document before canceling. |
| Routing Queue Settings | **No** | Document manually. |
| Saved Search Definitions | **No** | Export the results if needed; recreate filters, sorts, badges, and columns manually. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |
| Custom Klass Schema Definitions | **No** | Rebuild manually. Engineers can infer schemas by inspecting KObject instances via the API, but Kustomer lists schema definitions as non-exportable. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai)) |
| Custom Timeline Layouts | **No** | None. |
| SLA Policies | Partial (API read) | API returns SLA objects but not full rule logic. Timers and breach conditions must be manually recreated. |
| Audit Logs | Partial (API only) | `GET /v1/audit-logs` with filters. Short-term events stored up to 90 days; long-term events up to 12 months. Query before the retention window expires. ([help.kustomer.com](https://help.kustomer.com/audit-log-storage-limits-ByGmsAcWd?utm_source=openai)) |
| Deleted Records | **No** | Not recoverable once deleted. No "recycle bin" endpoint. |
| Integration Configurations | **No** | Document manually. |
| User Permissions / Role Assignments | Partial (API) | Roles readable via `GET /v1/roles`, but full permission matrices require manual mapping. |

The non-exportable items are operational configuration, not customer data. But for teams migrating to a new platform, losing workflow logic and routing rules means significant manual rebuild effort. Budget **2–5 days of PM time** to document these before canceling your Kustomer subscription.

> [!CAUTION]
> **Export before your contract ends.** Kustomer provides **no read-only access period** after the subscription end date. Kustomer's documentation does not specify a post-termination data retention window or a mechanism for requesting data exports after contract expiration. If you wait until after cutoff, your export project becomes an account-recovery problem instead of a data-portability project. Begin extraction at least 30 days before your contract end date. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

## Data Format, Encoding, and Post-Export Cleanup

Kustomer exports produce **CSV** files (native UI and Export Buddy) and **JSON** responses (API). KB articles export as **compressed ZIP** files. Even with a clean extraction, expect post-export cleanup before importing into a destination platform.

**Common issues to handle:**

- **HTML in text fields.** Message bodies often contain raw HTML. Strip or convert tags if the destination expects plain text or Markdown. Export Buddy KB exports carry article content in `htmlBody`; API article reads return HTML in `attributes.body`. Decide whether the target wants HTML, Markdown, or plain text before import.
- **UTF-8 encoding.** Kustomer exports use UTF-8, but special characters (emoji, accented characters) can corrupt when opened in Excel without specifying the encoding. Import CSVs with explicit `encoding='utf-8'` in your tooling.
- **Timezone drift.** API timestamps are in UTC (ISO 8601). Native CSV reporting exports default to **EST** but are configurable. Normalize all timestamps to UTC before import to avoid SLA and reporting history drift. ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))
- **Preview vs. full content.** Message reporting exports expose `preview` and `subject` — not full message bodies. Use the Messages API (`GET /v1/conversations/{id}/messages`) when you need complete transcript content. ([help.kustomer.com](https://help.kustomer.com/en_us/data-export-of-message-standard-attributes-HJSBh2UVj?utm_source=openai))
- **Orphaned references.** Conversations reference Customer IDs and User IDs. If you export conversations but skip customers, you'll have broken foreign keys.
- **Flattened relationships.** CSV exports flatten hierarchical data. A Customer → Conversation → Message → Attachment chain becomes separate flat files with no join keys unless you extract via the API. Kustomer export fields frequently expose relationship data in dot-notation columns.
- **Silently dropped custom fields.** If a custom attribute on a KObject is blank for the first batch of records in a saved search, the reporting engine may silently drop that column from the CSV entirely.
- **Soft-deleted metadata.** Export Buddy includes deleted snippets and user deactivation markers. Decide what should be migrated and what should stay behind. ([help.kustomer.com](https://help.kustomer.com/export-data-from-kustomer-SJ5yILO4j?utm_source=openai))

**Post-export validation checklist:**
1. ✅ Record counts match source (Customers, Conversations, Messages)
2. ✅ Date ranges cover full history (check for 2-year cutoff gaps)
3. ✅ Custom fields are present and populated (not silently dropped)
4. ✅ Message bodies contain full content (not truncated previews)
5. ✅ Attachments are downloadable (URLs haven't expired)
6. ✅ KObject relationships map correctly to parent Customer records
7. ✅ No duplicate records from overlapping export windows
8. ✅ Thread integrity: every Message maps to a valid Conversation ID
9. ✅ Active vs. soft-deleted metadata separated correctly

For a detailed look at the trade-offs of using CSVs for migration, see [Using CSVs for SaaS Data Migrations](https://clonepartner.com/blog/blog/csv-saas-data-migration/).

## Export for Migration vs. Backup vs. Compliance

The scope and format of your Kustomer export depend entirely on why you're exporting. The method that works for reporting does not automatically work for migration, backup, or compliance.

| Use Case | What You Need | Best Kustomer Path | Biggest Gap |
|---|---|---|---|
| **Migration** | Full transcripts, IDs, relationships, tags, notes, KObjects, attachments, user/team metadata | API + Export Buddy + separate attachment extraction | Native CSVs are too flat; config objects need manual rebuild |
| **Backup / Archive** | Repeatable full-fidelity snapshot with retention | API on a recurring schedule + webhook event stream for incremental capture; store raw JSON in S3 or equivalent | UI exports not deep enough; audit data ages out; no native backup feature |
| **Compliance / DSAR** | Person-linked data, timestamps, chain of custody, auditability | API + audit logs + documented handling | Audit retention is finite (90 days / 12 months); no one-button full account package |

**For migration:** You need full-fidelity relational data extracted via the API. Extract Users first, then Customers, then Conversations, then Messages — maintaining an ID mapping table so that when records get new IDs in the destination platform, associated Messages and Notes are attached correctly. Flat CSVs break Customer → Conversation → Message relationships and are not suitable for migration. See the [Help Desk Data Migration Playbook](https://clonepartner.com/blog/blog/help-desk-data-migration-playbook/) for a complete architectural breakdown. If you're moving to Zendesk, see [Kustomer to Zendesk Migration](https://clonepartner.com/blog/blog/kustomer-to-zendesk-migration-the-ctos-technical-guide/). For Help Scout, see [Kustomer to Help Scout Migration](https://clonepartner.com/blog/blog/kustomer-to-help-scout-migration-guide/).

**For backup:** Use the API to query records where `updatedAt` is greater than your last sync timestamp. Supplement with **webhook event streaming** (`customer.update`, `conversation.create`, `message.create`, etc.) to capture changes in near-real-time between full API sweeps. Store raw JSON payloads alongside downloaded attachments in a versioned archive. Kustomer does not offer a native backup feature. ([help.kustomer.com](https://help.kustomer.com/exporting-raw-reporting-data-r13iv58rf?utm_source=openai))

**For compliance (GDPR / DSAR):** Kustomer's API lets you extract all personal data associated with a specific customer in JSON — a structured, machine-readable format as required by GDPR Article 20. Kustomer states their platform provides functionality to respond to data subject rights requests including access, correction, deletion, and portability. Audit retention is limited by event type (90 days for short-term, 12 months for long-term), so compliance-grade exports should be planned before the data ages out. ([help.kustomer.com](https://help.kustomer.com/audit-log-storage-limits-ByGmsAcWd?utm_source=openai)) For broader compliance requirements during migration, see the [GDPR Compliant Data Migration guide](https://clonepartner.com/blog/blog/gdpr-compliant-data-migration-the-enterprise-blueprint/).

## Vendor Lock-In and Data Portability Assessment

**Kustomer's data portability rating: Partially Locked.**

The underlying customer data is not held hostage — the API provides access to virtually all historical records. The lock-in shows up in three specific places:

1. **Native export limits are too small for real exits.** 30-day reporting windows and 50K saved search caps are reporting features, not migration features. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/export-your-data-H1X6zdrVs?utm_source=openai))
2. **History is split across search tiers.** Conversation, message, and KObject data older than 2 years requires Archive Search logic — a different API endpoint and additional scripting. ([help.kustomer.com](https://help.kustomer.com/en_us/kustomer-api-frequently-asked-questions-rJPDs3yAZg?utm_source=openai))
3. **Configuration is not portable.** Business rules, workflows, saved searches, and custom Klass schema definitions are not part of supported exports. ([help.kustomer.com](https://help.kustomer.com/en_us/methods-to-export-data-HyRj3jUSi?utm_source=openai))

**Breaking it down:**

- **~70% exportable cleanly:** Customer records, conversation metadata, message bodies, notes, KObjects, users, teams, tags, snippets, and KB articles — all accessible via the API in structured JSON with relationships preserved.
- **~20% requires significant engineering:** The 2-year search cutoff, 100-page pagination limit, and per-conversation message/attachment extraction all require custom scripting with error handling, retry logic, and cursor management. This is not a simple export — it is a data engineering project.
- **~10% is lost:** Workflow automations, business rules, routing configurations, conversational assistant setups, and custom timeline layouts cannot be programmatically extracted and must be manually documented and rebuilt.

**How Kustomer compares to other help desk platforms:** Zendesk offers a bulk XML export (Enterprise plans) and incremental API endpoints with cursor-based pagination and no hard page limit. Intercom provides a GDPR-oriented data export and REST API but has similar per-conversation message retrieval requirements. Freshdesk offers a straightforward API with higher default rate limits (per minute per app) and native data export to CSV for tickets. Kustomer's 2-year search cutoff and 100-page hard pagination limit are more restrictive than Zendesk's incremental export pattern, but Kustomer's API coverage of custom objects (KObjects) is more flexible than Freshdesk's custom object support.

The real switching cost is not data access — it is the engineering time required to work around the API constraints. A team with 200,000 conversations and custom KObjects should budget **40–80 hours** of developer time for a complete extraction, plus PM time for validation and configuration documentation.

> [!NOTE]
> **Only Admins and Organization Owners can export data from Kustomer.** There is no free plan or trial. Once you cancel your subscription, you lose access. Export everything before canceling.

## Timeline and Resourcing for a Full Data Export

Realistic extraction timelines based on dataset size:

| Dataset Size | Typical Timeline | Minimum Team |
|---|---|---|
| Small (<10K records) | 1–2 days | 1 admin for UI exports; 1 developer for API |
| Medium (10K–100K records) | 3–7 days | 1 developer + 1 PM/analyst |
| Large (100K+ records) | 1–3 weeks | 1–2 developers + 1 PM + QA/data analyst |

**Typical phase breakdown:**

- **Scoping (0.5–2 days):** Confirm objects, date ranges, KObject schemas, attachment requirements, and compliance scope.
- **Access setup (hours to 1 day):** API keys, permission scopes, sandbox testing, plan-limit checks. Verify your plan's org-wide rate limit (300–2,000 RPM) and confirm the per-key 100 RPM machine-user cap.
- **Extraction (minutes to days):** Minutes for UI exports. Hours to days for API exports once you account for Archive Search, per-conversation messages, attachments, and rate-limit retries.
- **Validation (0.5–3 days):** Compare record counts, spot-check transcripts, confirm tag and team mappings, verify old-history coverage past the 2-year boundary.
- **Cleanup and transformation (variable):** Flat CSV work is faster. Relationship-preserving imports into a destination platform take significantly longer.

The biggest schedule multipliers are **attachments** (per-conversation API calls bottlenecked by rate limits), **archived data** (Archive Search endpoint adds scripting complexity), and **custom KObjects** (complex nested structures that require schema understanding). These are where Kustomer data portability stops being a reporting task and becomes a data engineering project.

> [!TIP]
> **If your engineering team is busy shipping product,** don't force them to build one-off pagination and archive-search scripts. A managed export service eliminates the internal resource drain and guarantees data integrity — especially for large datasets with KObjects, attachments, and data spanning the 2-year archive boundary.

## The Practical Decision

If your goal is a quick CSV for recent reporting, the UI is fine. If your goal is a migration-grade export with older conversations, full transcripts, attachments, and KObjects intact, start with the API design on day one and treat native exports as supporting tools, not the main plan. ([help.kustomer.com](https://help.kustomer.com/en_us/categories/export-your-data-H1X6zdrVs?utm_source=openai))

## Frequently asked questions

### Can I export all my data from Kustomer?

You can export most customer and conversation data using the REST API, but no single native tool covers everything. The native UI is limited to 30-day windows and 25 attributes. Business rules, workflows, saved search definitions, and custom Klass schema definitions are explicitly listed by Kustomer as non-exportable through any method.

### Does Kustomer export include attachments?

No. Native CSV exports, saved search exports, and Export Buddy do not include attachments. You must use the API endpoint GET /v1/conversations/{id}/attachments to retrieve attachment metadata and then download each file individually via its URL. There is no bulk attachment download endpoint.

### How long does it take to export data from Kustomer?

For small datasets under 10,000 records, native UI exports complete in minutes. For API-based full exports of 100,000+ records including messages and attachments, expect 1–3 weeks including scripting, extraction, and validation. The per-conversation message and attachment retrieval is bottlenecked by the 100 RPM rate limit.

### What data cannot be exported from Kustomer?

Business rules, workflow automations, conversational assistant configurations, custom timeline layouts, routing queue settings, saved search definitions, and custom Klass schema definitions cannot be exported through any method — native UI, Export Buddy, or API. These must be manually documented before canceling your account.

### What format does Kustomer export data in?

Native reporting and saved search exports produce CSV files. Export Buddy outputs CSV for most data types and compressed ZIP for Knowledge Base articles. The REST API returns JSON. KB article content is HTML in both Export Buddy (htmlBody field) and API responses (attributes.body field).
