How to Export Data from Zendesk Guide: Methods, Limits & Formats
Zendesk has no native export for Help Center articles. Learn how to extract articles, attachments, and themes via the API or marketplace apps — with rate limits and gotchas.
Zendesk does not have a built-in "Export to CSV" button for Help Center articles. Their own documentation says it plainly: "There isn't a prebuilt Zendesk tool to export articles." (support.zendesk.com) If you need to back up, audit, or migrate your knowledge base, the real options are: write a script against the Help Center API, use a third-party marketplace app, or hire someone who has done it before.
This guide walks through each method — what data each approach actually extracts, what it silently drops, the exact API rate limits you'll hit, and the attachment and image pitfalls that catch most teams off guard.
(Exporting knowledge base articles is a completely separate process from exporting support tickets. Ticket export uses different APIs and tools. See How to Export Tickets from Zendesk for that workflow.)
What Data Can You Export from Zendesk Guide?
Before picking a method, understand what Zendesk Guide actually stores.
- Articles — via the Articles API. The body is HTML. Article objects include dates,
html_url, draft state (which is locale-specific), and visibility metadata likepermission_group_idanduser_segment_id. (developer.zendesk.com) - Categories and sections — via separate API endpoints. Categories are top-level containers, sections live inside categories. On supported plans, sections can nest inside other sections up to five levels deep, so a flat CSV is rarely the full picture. (developer.zendesk.com)
- Translations — via dedicated translation endpoints. Export category and section translations alongside article translations — translated articles won't display in the Help Center if their parent containers aren't translated in the same locale. (developer.zendesk.com)
- Attachments and inline images — via the Article Attachments endpoint, not from the article list itself. Each attachment has a
content_url; files are capped at 20 MB each. (developer.zendesk.com) - Theme code — as a ZIP download from the admin UI if you have code access. Theme code is not available through the Help Center API. (support.zendesk.com)
- Content blocks — Zendesk's reusable content snippets. The API flattens these to inline text; the block reference is destroyed on export.
Here's what each extraction method actually returns:
| Data Type | Help Center API (JSON) | Swifteq Free CSV | Swifteq Help Center Manager | Manual Copy-Paste |
|---|---|---|---|---|
| Article metadata (title, author, dates, labels, locale) | ✅ Full | ✅ Full | ✅ Full | ❌ Partial |
| Article body (HTML) | ✅ Full | ❌ Plain text only | ✅ HTML, DOCX, PDF | ❌ Loses formatting |
| Categories & Sections (hierarchy, IDs) | ✅ Separate endpoints | ✅ Section/category names | ✅ Names | ❌ |
| Inline images | ⚠️ Returns content_url only — must download separately |
❌ | ⚠️ Depends on format | ❌ |
| Block attachments (PDFs, downloads) | ✅ Separate endpoint | ❌ | ⚠️ Limited | ❌ |
| Translations (multilingual articles) | ✅ Per-locale endpoints | ✅ Per-language export | ✅ | ❌ |
| User segments (access permissions) | ✅ | ❌ | ❌ | ❌ |
| Content blocks (reusable content) | ⚠️ Flattened to inline text | ❌ | ❌ | ❌ |
| Article comments | ✅ Separate endpoint | ❌ | ❌ | ❌ |
| Theme code (HTML/CSS/JS) | ❌ Use theme export | ❌ | ❌ | ❌ |
Why Exporting Zendesk Guide Is Harder Than It Looks
Most failed DIY exports make one wrong assumption: they treat Guide as a flat bag of article bodies. It isn't.
Zendesk Guide enforces a hierarchy: Categories → Sections → Articles. If you extract articles into a flat file without recording their parent section_id and category_id, you lose the relational context. When you import that data into a new platform, you end up with a disorganized dump of orphaned articles. On supported plans, sections can also nest inside other sections up to five levels deep, which means even a carefully structured CSV can miss structural nuances. If you're planning a CSV SaaS data migration, map this hierarchy carefully before committing to CSV as your master format.
The HTML formatting trap. Zendesk Guide articles are stored as HTML. If you export them to CSV with a basic script, spreadsheet software like Excel will mangle the HTML tags. Excel also enforces a 32,767-character cell limit — lengthy, HTML-heavy articles can easily exceed that threshold.
Requester identity matters. Help Center endpoints return only what the authenticated user can view. Anonymous requests will hit some public article endpoints, but that's not a complete backup. For backup-grade exports, always authenticate as an agent or admin so you capture non-public and localized content. (developer.zendesk.com)
User data requires cross-referencing. The API returns an author_id, not the author's name. To make your export human-readable, cross-reference these IDs against the Zendesk Support /api/v2/users endpoint. If an agent's profile has been deleted, the ID will point to a null record — standard export scripts often throw unhandled exceptions here.
Method 1: The Zendesk Help Center API
The Help Center API is Zendesk's official recommendation for bulk exports. It gives you full control over what you extract and in what format, but it requires code.
Generate an API Token
- Go to Admin Center → Apps and integrations → Zendesk API
- Enable Token Access if it's not already on
- Click Add API token and give it a descriptive name
- Copy the token immediately — Zendesk only shows it once
Authentication uses the format {email}/token:{api_token} as HTTP Basic Auth. OAuth is also supported, but note: OAuth only returns published content. If you need draft or internal articles, you must use Basic Auth. (developer.zendesk.com)
Pull Categories, Sections, and Articles
You need three separate API calls to reconstruct the full hierarchy:
# List all categories
curl https://{subdomain}.zendesk.com/api/v2/help_center/categories.json \
-u {email}/token:{api_token}
# List all sections
curl https://{subdomain}.zendesk.com/api/v2/help_center/sections.json \
-u {email}/token:{api_token}
# List all articles
curl https://{subdomain}.zendesk.com/api/v2/help_center/articles.json \
-u {email}/token:{api_token}Each article includes section_id, and each section includes category_id. Join these yourself to reconstruct the tree. On accounts with nested sections, preserve the parent-child section relationships instead of flattening everything.
For translations, also pull:
GET /api/v2/help_center/articles/{article_id}/translations
GET /api/v2/help_center/categories/{category_id}/translations
GET /api/v2/help_center/sections/{section_id}/translationsEach translation is a separate JSON object with its own title, body, and locale identifier. Don't skip category and section translations — Zendesk won't display a translated article if its parent section or category isn't translated in the same locale. (support.zendesk.com)
Handle Pagination
Zendesk supports two pagination methods:
- Cursor-based pagination (recommended): Add
?page [size]=100to your request. Follow thenextlink in each response until it returnsnull. - Offset pagination (legacy): Uses
pageandper_pageparameters. Hard-capped at 100 pages — if you have more than 10,000 articles at 100 per page, offset pagination silently stops returning results.
import requests
import time
SUBDOMAIN = "yourcompany"
AUTH = ("you@company.com/token", "your_api_token")
def fetch_all_articles():
articles = []
url = f"https://{SUBDOMAIN}.zendesk.com/api/v2/help_center/articles.json?page[size]=100"
while url:
response = requests.get(url, auth=AUTH)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
time.sleep(retry_after)
continue
response.raise_for_status()
data = response.json()
articles.extend(data["articles"])
url = data["links"].get("next")
return articlesRespect Rate Limits
Help Center API rate limits vary by plan:
| Zendesk Suite Plan | Requests per Minute |
|---|---|
| Team | 200 |
| Growth | 400 |
| Professional | 400 |
| Enterprise | 700 |
| Enterprise Plus | 2,500 |
| High Volume API add-on | 2,500 |
The Help Center API has its own rate limit bucket, separate from the Support API. Requests to one don't count against the other. On an Enterprise plan, you can make 700 requests/min to Help Center and 700 requests/min to Support simultaneously. (developer.zendesk.com)
The High Volume API add-on bumps your limit to 2,500 req/min and is available on Growth plans and above with a minimum of 10 agent seats. Enterprise Plus includes it by default.
When you hit the limit, the API returns 429 Too Many Requests with a Retry-After header. Your script must catch this and pause:
if response.status_code == 429:
wait = int(response.headers.get("Retry-After", 60))
time.sleep(wait)Use Incremental Exports for Ongoing Sync
If you need recurring exports rather than a one-time dump, the incremental article endpoint returns only articles modified since a given timestamp:
GET /api/v2/help_center/incremental/articles.json?start_time={unix_epoch}
Store the end_time from each response and use it as the start_time for the next run. The incremental endpoint has a separate, stricter rate limit: 10 requests per minute (30 with the High Volume add-on).
Search API is not a backup tool. Zendesk's Search Articles endpoint is useful for filtered exports by category, label, or locale, but it uses offset pagination, returns at most 1,000 results, and Zendesk warns that updated_* filters can drift from updated_at because not every update is re-indexed. For authoritative deltas, use the incremental articles endpoint instead. (developer.zendesk.com)
JSON vs. CSV Output
The API returns JSON natively. This preserves the nested structure of articles, translations, and attachment URLs — the right format for building an automated pipeline to another system.
CSV is easier for content managers to audit but fundamentally incompatible with hierarchical data. If you must output CSV, flatten the data into columns for Category Name, Section Name, Article Title, and HTML Body. Be aware of Excel's 32,767-character cell limit — HTML-heavy articles can exceed it.
Method 2: Third-Party Marketplace Apps
If scripting isn't an option, several marketplace tools can get you partway there.
Swifteq Help Center Export (Free)
Swifteq's free app exports your entire Help Center as a CSV file delivered to your email. It includes article titles, section names, category names, labels, URLs, language, and update dates.
What you get: Article metadata and plain-text content in CSV format, broken-link detection, and multi-language support (separate CSV per locale).
What you don't get: HTML body content (plain text only in the free tier), inline images, file attachments, or permission data.
One specific limitation: if an article's HTML exceeds 32,767 characters, the extra content is pushed into an additional row. (support.swifteq.com)
The free export is good for content audits — spotting outdated articles, checking coverage gaps, reviewing labels. It is not a migration-ready export.
Swifteq Help Center Manager (Paid — €89/month)
The paid tier adds exports in HTML, DOCX, and PDF formats with article body formatting. It also includes bulk article editing, find-and-replace, analytics, and translation management. For teams that need a quick formatted backup without writing code, this is the fastest path.
Other Options
- kBackup — Zendesk's own documentation recommends it for one-click Help Center backups. Verify compatibility with your current Zendesk instance, as it hasn't been recently updated.
- OAPPS Advanced Export — Supports CSV, HTML, JSON, and XLSX for Guide content, with embedded images and attached files. Note: exported data is stored on the vendor's servers for 30 days, which matters for regulated data. (zendesk.com)
- Scott Havard's GitHub scripts — A popular DIY starting point: Python,
requests,pandas, CSV output. Free and open, but no vendor support or built-in asset rewriting. (github.com) - Help Desk Migration — Focused on CSV export and broader migration workflows rather than archival fidelity. Useful if you're changing platforms and don't want to own the scripting.
The trade-off with apps is control. They choose the schema, the attachment handling, and the validation story for you. If the output needs to be import-ready for another platform, inspect a sample export before you commit.
The Hidden Trap: Inline Images and Attachments
This is where most DIY exports break down.
When you pull an article via the API, the body field contains raw HTML. Inline images point to Zendesk-hosted URLs:
<img src="https://yourcompany.zendesk.com/hc/article_attachments/12345678/screenshot.png">Those URLs work as long as the images are in a public Help Center. If your Help Center requires sign-in, or if you're migrating content to another platform, those URLs will redirect to the Zendesk login page — or return 403 Forbidden to unauthorized scripts.
The API does not download images for you. You must fetch them separately via the Article Attachments endpoint:
curl https://{subdomain}.zendesk.com/api/v2/help_center/articles/{article_id}/attachments.json \
-u {email}/token:{api_token}The response distinguishes between inline attachments (embedded images) and block attachments (downloadable files like PDFs). Each has a content_url you need to GET individually, with authentication headers.
For a complete export, your script must:
- Fetch all article attachments via the API
- Download each file using the
content_url - Save files locally with a sane naming convention
- Rewrite the
srcattributes in the article HTML to point to your local paths or new hosting destination
from pathlib import Path
import requests
def localize_assets(article_html, attachments, article_id):
asset_dir = Path('assets') / str(article_id)
asset_dir.mkdir(parents=True, exist_ok=True)
for att in attachments:
local_name = f"{att['id']}-{att['file_name']}"
target = asset_dir / local_name
with requests.get(att['content_url'], auth=AUTH, timeout=60, stream=True) as r:
r.raise_for_status()
with open(target, 'wb') as f:
for chunk in r.iter_content(1024 * 64):
f.write(chunk)
article_html = article_html.replace(
att['content_url'],
f'./assets/{article_id}/{local_name}'
)
return article_htmlThat HTML path rewriting step is the one teams consistently underestimate. If you skip it, every image in your exported articles breaks the moment they leave Zendesk. We cover the downstream risks of this in our Zendesk to Freshdesk migration guide.
Multilingual gotcha: Inline attachments are localized. The same image in two translations of the same article creates two separate article_attachment records with different IDs. Your export script must handle per-locale attachment resolution or you'll get missing images in translated articles.
Zendesk also uses Guide Media URLs that can be embedded directly in article HTML and later associated with article attachments when the article is published. The exported HTML can reference Zendesk-owned media paths while the actual binary lives behind a separate download URL. Normalize these paths too, or your export looks complete in the JSON and broken everywhere else. (developer.zendesk.com)
If your Help Center is image-heavy, the attachment download step alone can take hours once you factor in rate limiting. The file size cap per attachment is 20 MB.
The Content Blocks Problem
Zendesk's content blocks — reusable content snippets shared across articles — create a specific export challenge.
Content blocks are enabled by default for Enterprise customers. When you export an article containing content blocks via the API, the block content is converted to flat inline text. The block reference is destroyed.
This means:
- You cannot distinguish "regular" article text from content-block text in the export
- Re-importing the exported HTML will not recreate the blocks — they become permanent inline text
- If the same content block is used in 50 articles, you get 50 independent copies with no linkage between them
There is currently no public API for managing content blocks directly. Content blocks are a one-way export: you get the rendered text, but you lose the reusability.
Exporting Your Guide Theme Code
Your Help Center's visual theme — HTML templates, CSS, JavaScript — is separate from article content and requires a different export path.
On Suite Growth and above (or Guide Professional for standalone Guide): You can export your theme from the admin UI as a ZIP file. Go to Admin Center → Channels → Help Center → Themes, select your theme, and download it. The ZIP contains your manifest.json, template files, CSS, JS, and static assets. (support.zendesk.com)
On lower-tier plans: There is no theme export option. Zendesk recommends manually copying and pasting code from the theme editor into a text editor. There is no API access to theme code on any plan.
Two catches worth knowing: if you're using a marketplace theme with a trial or standard license, you cannot download or customize it — only developer-licensed marketplace themes allow that. And if you're migrating to a different platform, the theme code is rarely portable since it uses Zendesk-specific Handlebars/Curlybars templating.
Zendesk Help Center API Rate Limits: Quick Reference
For teams building export scripts, here's the complete rate limit picture:
| Constraint | Limit |
|---|---|
| Suite Team requests/min | 200 |
| Suite Growth requests/min | 400 |
| Suite Professional requests/min | 400 |
| Suite Enterprise requests/min | 700 |
| Suite Enterprise Plus requests/min | 2,500 |
| High Volume add-on | 2,500 req/min (Growth+, 10+ seats) |
| Offset pagination max pages | 100 |
| Default records per page (offset) | 30 |
| Max records per page (cursor) | 100 |
| Incremental export endpoint | 10 req/min (30 with High Volume) |
| Article attachment file size | 20 MB |
| Rate limit exceeded response | HTTP 429 + Retry-After header |
Help Center API and Support API requests are tracked separately. Hitting your limit on one does not affect the other.
Picking the Right Export Method
The best approach depends on what you're trying to accomplish:
| Goal | Recommended Method |
|---|---|
| Quick content audit (outdated articles, broken links) | Swifteq free CSV export |
| One-time backup with formatting | Swifteq Help Center Manager (paid) |
| Automated recurring backup | Custom API script with incremental export |
| Migration to another platform | Custom API script + attachment download + path rewriting (or talk to us) |
| Theme/design backup | Native theme export (Growth+ / Professional+) |
For anything beyond a basic audit, you end up writing code or hiring someone who already has. The API is well-documented, but the real work is in the details — especially if your Help Center has hundreds of articles with inline images, multiple languages, restricted user segments, and content blocks.
How ClonePartner Handles Knowledge Base Exports
We've done this enough times to know where the pain concentrates: it's rarely the API calls themselves. It's the attachment handling, the hierarchy preservation, and the edge cases around content blocks, user segments, and multilingual content that turn a "quick export script" into a multi-week project.
When we handle a Zendesk Guide migration, our scripts:
- Download every inline image and block attachment, store them locally, and rewrite HTML paths so articles render correctly offline or in the target platform
- Preserve the full hierarchy — Categories → Sections (including nested sections) → Articles — with all IDs mapped so the structure survives the move intact
- Handle API throttling automatically with exponential backoff, respecting per-plan rate limits without manual babysitting
- Export all locales with per-translation attachment resolution, so multilingual help centers don't lose images in non-default languages
- QA counts by locale, asset type, and draft state before mapping anything into the destination
The export is only half the problem — the import side has its own field mapping challenges. For platform-specific guidance, see our migration guides: Zendesk to Freshdesk, Zendesk to Intercom, or Zendesk to Help Scout.
Frequently Asked Questions
- Can you export articles from Zendesk Help Center to CSV?
- Zendesk has no native CSV export for Help Center articles. You can use Swifteq's free Help Center Export app for a metadata-and-plain-text CSV, or write a custom script against the Help Center API to generate a CSV with full HTML body content. The free CSV option does not include inline images or file attachments.
- What are the Zendesk Help Center API rate limits?
- Rate limits depend on your plan: 200 req/min (Team), 400 req/min (Growth and Professional), 700 req/min (Enterprise), and 2,500 req/min (Enterprise Plus or with the High Volume API add-on). Help Center and Support API limits are tracked in separate buckets.
- How do I export inline images from Zendesk Guide articles?
- The API returns article HTML with image URLs pointing to Zendesk-hosted files. You must separately call the Article Attachments endpoint for each article, download each file via its content_url with authentication, and rewrite the src attributes in the article HTML to point to your local copies.
- Does a Zendesk Guide export include content blocks?
- Partially. The API flattens content blocks into inline text within the article body. You get the rendered content, but the block reference and reusability are permanently lost. There is no public API to export or manage content blocks as separate objects.
- Can I export my Zendesk Help Center theme?
- Yes, as a ZIP file if you have code access — available on Suite Growth and above, or Guide Professional for standalone Guide. Go to Admin Center → Channels → Help Center → Themes and download. Theme code is not available through the Help Center API on any plan. Lower-tier plans require manually copying code from the theme editor.