How to Export Data from Helpjuice: Methods, API Limits & Portability
Complete guide to exporting data from Helpjuice via backup zip, CSV/XLS, PDF, and API v3. Covers rate limits, pagination, media gaps, and migration-ready extraction.
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 Helpjuice: Methods, API Limits & Portability
Helpjuice gives you four primary ways to get data out: a full backup zip (CSV files plus uploaded media), XLS/CSV exports from the admin dashboard, per-article PDF/DOCX/HTML exports, and the REST API v3. A separate Analytics API handles search and engagement data. Unlike many knowledge base platforms, such as Help Scout or Helpshift, Helpjuice is relatively export-friendly — but none of the UI methods give you a single migration-ready dataset with relational integrity intact.
If you are moving to another platform, you will almost certainly need API v3 combined with the backup zip to get a complete, structured extraction. The API gives you clean JSON with articles linked to categories, authors, and keywords. The backup gives you uploaded media files and multi-category mappings that the API does not reliably expose. This guide covers every extraction method, what each one actually returns, the exact rate limits and pagination constraints, field-level differences between bulk and single-record endpoints, and the gaps that can silently break a migration.
Disclosure: This guide is written by ClonePartner, a migration service provider. We have a commercial interest in your migration project. The technical information reflects documented API behavior and should be verified against Helpjuice's official API v3 documentation. API behavior verified against v3 documentation as of Q3 2025.
What Data Can You Export from Helpjuice?
Helpjuice's data model centers on Articles (called "Questions" in the legacy API and backup CSVs), Answers (article bodies in HTML), Categories, Users, Groups, Activities, Searches (analytics), and uploaded media. The terminology is a legacy artifact: "Questions" = article metadata, "Answers" = article body content. This distinction matters immediately when parsing backup CSVs or v2 API responses where you will never see the word "article."
Here is what each export method actually gets you:
| Data Object | Backup (Zip) | XLS/CSV Export | PDF/DOCX/HTML | API v3 |
|---|---|---|---|---|
| Article Metadata | ✅ questions.csv | ✅ Questions file | Title only | ✅ Full JSON |
| Article Bodies | ✅ answers.csv (HTML) | ✅ Answers file (HTML) | ✅ Rendered | ✅ body + body_txt |
| Categories | ✅ categories.csv | ✅ Categories file | Per-category only | ✅ Full tree |
| Category Hierarchy | ✅ parent_id in CSV | ✅ parent_id column | ❌ | ✅ parent_id field |
| Multi-Category Mapping | ✅ categorizations.csv | ❌ | ❌ | ❌ Not reliably exposed |
| Users | ✅ Included in zip | ✅ Users file | ❌ | ✅ Full CRUD |
| Groups | ✅ groups.csv | ❌ | ❌ | ✅ Full CRUD |
| Permissions / Passes | ✅ passes.csv | ❌ | ❌ | ❌ |
| Search Analytics | ❌ | ✅ Searches file | ❌ | ✅ Analytics API |
| Activities / Audit Log | ❌ | ✅ Activities file | ❌ | ✅ Activities API |
| Uploaded Media | ✅ In categories folder | ❌ | ✅ Embedded | ❌ No direct endpoint |
| Webhooks Config | ❌ | ❌ | ❌ | ✅ Full CRUD |
| Account Settings | ❌ | ❌ | ❌ | ✅ Read/Write |
The critical gap: Uploaded media (images and files embedded in articles) is included in the backup zip but has no dedicated API endpoint. If you use the API alone to extract articles, the body field contains HTML with image URLs pointing to Helpjuice's CDN (static.helpjuice.com). Those URLs work as long as your account is active, but they are not permanent. You must parse them out and download them separately.
Method 1: Backup & Restore (Full Zip Download)
Best for: Complete offline backup, disaster recovery, or migration prep when you want raw data for all objects at once.
The backup is the closest thing Helpjuice has to an "export everything" button. The zip file contains:
- questions.csv — Article metadata (id, codename/slug, name, description, views, created_at, updated_at, is_published, language_id, category_id, joined_tag_names, language_code, next_expiration_on)
- answers.csv — Article body content (id, question_id, user_id, body as HTML)
- categories.csv — All categories (id, parent_id, name)
- categorizations.csv — Article-to-category mapping (supports many-to-many via "Also Display In")
- groups.csv — User groups and permissions
- passes.csv — Permission passes for categories and articles
- uploads.csv — Table of uploaded assets with filenames
- categories/ folder — The actual uploaded image/media files
- account_id — Your account identifier
How to access it:
- Log in as a Super Administrator or Administrator
- Navigate to Backup & Restore in the dashboard
- Download the latest backup
Backup freshness matters. Helpjuice creates backups on a configurable schedule (every 12 hours by default), stored for 7 days. Before starting a migration extraction, verify the completed_at timestamp of the most recent backup to ensure it reflects the current state of your knowledge base. (help.helpjuice.com)
Backup limitations
- CSV format only. No JSON. Article bodies are raw HTML strings inside CSV cells, which means you need to handle CSV escaping carefully — HTML with commas, quotes, and newlines inside cells can break naive parsers. Use a library that handles RFC 4180 CSV correctly (Python's
csvmodule, not a naivesplit(',')approach). - Articles are split across two files. You must join
questions.csvandanswers.csvonquestion_idto reassemble a complete article. - No incremental backups. Every backup is a full snapshot.
- Internal/private content is included. Unlike PDF/DOCX exports, the backup does contain internal and private articles.
answer []is an array. Helpjuice supports multiple answer records per question (used for versioning and localization). Theanswers.csvwill contain multiple rows forquestion_idif the article has been through versioning cycles or has language variants. Join on bothquestion_idand the most recentupdated_atto get the current content.
Method 2: XLS/CSV Export from Admin Dashboard
Best for: Quick ad-hoc exports for reporting, auditing, or feeding into spreadsheet tools.
From Settings > Export Data, you can export six object types individually: Answers, Questions, Categories, Users, Searches, and Activities — each as XLS or CSV.
Key behavior:
- Exports are emailed to you and also downloadable from the Recent Exports section.
- Only Super Administrators and Administrators can access this.
- Article bodies (Answers) are exported as raw HTML.
- You need to download both Questions and Answers files to get a complete article dataset.
Data dictionary
Questions (Article Metadata):
| Column | Type | What It Contains |
|---|---|---|
id |
Integer | Article ID |
codename |
String | Article slug (URL-safe identifier) |
name |
String | Article title |
description |
String | Article description/summary |
views |
Integer | All-time view count |
created_at / updated_at |
ISO Timestamp | Creation and last-modified timestamps |
is_published |
Boolean | TRUE/FALSE |
language_id |
Integer | Internal language identifier |
language_code |
String | BCP 47 code, e.g. en_US |
category_id |
Integer | Primary category ID (not all categories for multi-category articles) |
joined_tag_names |
String | Comma-separated keywords/tags |
next_expiration_on |
Date | Article expiration date if set |
Answers (Article Bodies):
| Column | Type | What It Contains |
|---|---|---|
id |
Integer | Answer record ID |
question_id |
Integer | Links to Questions.id |
user_id |
Integer | Author ID (join to users for email/name) |
body |
HTML String | Full article content as HTML |
The XLS/CSV export and the backup zip contain the same underlying data for articles. If you only need search analytics or user data, the dashboard export is faster than downloading a full backup.
Method 3: Per-Article and Per-Category PDF, DOCX, HTML
Best for: Sharing formatted documentation externally, archiving individual articles, or content review.
You can export individual articles or entire categories to PDF, DOCX, or HTML from the dashboard. The export is generated server-side and emailed to you.
Why this is not a migration tool:
- Internal sections are stripped. Articles with internal blocks will have those blocks removed from the PDF/DOCX output. If you have mixed-visibility content, these exports are incomplete.
- One category at a time. You cannot select multiple categories for a single export.
- No relational data. No IDs, no metadata, no category mappings, no author information.
- PDF customization is available. You can add a header, logo, custom text, and toggle a table of contents via Settings > Export Settings.
Do not use PDF or DOCX as your canonical migration source. Helpjuice excludes internal sections from those exports, and they do not preserve the relational structure you need for clean re-import or replatforming. (help.helpjuice.com)
Method 4: Helpjuice REST API v3
Best for: Programmatic extraction of structured data for migration, integration, or sync workflows.
The API v3 is the only method that gives you clean, structured JSON with relational links between articles, categories, users, and groups. It is the right tool for any migration or integration project.
Authentication
All API v3 requests require an API key, passed either as:
- An
AuthorizationHTTP header - An
api_keyquery parameter
The API key is found at Settings > API Credentials. The "Require token for API" option must be enabled. The key must belong to an Administrator account and effectively grants Super Administrator privileges — keep it server-side, not in frontend code.
# Header-based auth
curl -H "Authorization: YOUR_API_KEY" \
https://yourcompany.helpjuice.com/api/v3/articles
# Query parameter auth
curl https://yourcompany.helpjuice.com/api/v3/articles?api_key=YOUR_API_KEYHelpjuice also supports an impersonation pattern: use HTTP Basic Auth with a user's email as the username and a blank password to execute requests scoped to that user's access level. This is useful for verifying what internal or private content a given user can see before running a full export. (help.helpjuice.com)
Core Endpoints for Export
| Endpoint | Method | Returns |
|---|---|---|
/api/v3/articles |
GET | All articles with body, metadata, keywords |
/api/v3/articles/:id |
GET | Single article with full detail |
/api/v3/categories |
GET | All categories with published/draft article lists |
/api/v3/categories/:id |
GET | Single category with article references |
/api/v3/users |
GET | All users with roles |
/api/v3/groups |
GET | All groups with member lists |
/api/v3/activities |
GET | Audit log of all actions |
/api/v3/analytics/searches |
GET | Search analytics data |
/api/v3/backups |
GET | List of available backups with download URLs |
/api/v3/settings/account |
GET | Account configuration |
/api/v3/webhooks |
GET/POST | Webhook configurations |
The /api/v3/backups endpoint lists existing backups — it does not trigger a new one. Each entry in the response includes a download_url (authenticated, time-limited), a completed_at timestamp, and a status field. The download URL requires the same API key authentication as other endpoints. Use this endpoint to programmatically verify backup freshness before beginning a migration run.
Pagination
All collection endpoints return paginated results. The response includes a meta object:
{
"meta": {
"current": 1,
"limit": 25,
"total_pages": 4,
"total_count": 50
}
}- Default page size: 25 records
- Maximum page size: 1,000 records (set via
?limit=1000) - Page navigation:
?page=2&limit=1000
For a complete export, loop through pages until current equals total_pages:
import requests
import time
base = "https://yourcompany.helpjuice.com/api/v3/articles"
headers = {"Authorization": "YOUR_API_KEY"}
all_articles = []
page = 1
while True:
resp = requests.get(base, headers=headers, params={"page": page, "limit": 1000})
if resp.status_code == 429:
# Helpjuice returns 429 when rate limit is exceeded.
# Retry-After header is not documented; use exponential backoff.
wait = 2 ** (page % 5) # cap backoff at ~32 seconds
print(f"Rate limited. Waiting {wait}s before retry.")
time.sleep(wait)
continue
resp.raise_for_status()
data = resp.json()
all_articles.extend(data["articles"])
if page >= data["meta"]["total_pages"]:
break
page += 1
time.sleep(0.65) # ~92 requests/min, safely under 100/min limitRate Limits
Helpjuice API v3 enforces a rate limit of 100 requests per minute — roughly 1.6 requests per second. When exceeded, the API returns HTTP 429 Too Many Requests. The response body contains an error message; a Retry-After header is not documented in Helpjuice's official API reference, so implement exponential backoff rather than relying on header-driven retry timing.
Rate limit planning by KB size:
| KB Size | Articles | Pages at 1,000/page | Individual fetches needed | Total requests | Time at 100 req/min |
|---|---|---|---|---|---|
| Small | 500 | 1 | 500 (if processed_body needed) | 501 | ~5 min |
| Medium | 2,000 | 2 | 2,000 | 2,002 | ~20 min |
| Large | 5,000 | 5 | 5,000 | 5,005 | ~50 min |
| Very large | 10,000 | 10 | 10,000 | 10,010 | ~100 min |
Add a 650ms delay between requests (0.65s × 100 = 65s per 100 requests, leaving headroom) to stay safely under the limit without sacrificing throughput.
Bulk vs. Single-Record API Response: Field Comparison
This is the most consequential difference for migration work. The bulk list endpoint (GET /api/v3/articles) and the single-article endpoint (GET /api/v3/articles/:id) return different field sets:
| Field | Bulk List (/articles) |
Single Record (/articles/:id) |
Notes |
|---|---|---|---|
id |
✅ | ✅ | |
name |
✅ | ✅ | Article title |
description |
✅ | ✅ | |
codename |
✅ | ✅ | URL slug |
views |
✅ | ✅ | |
accessibility |
✅ | ✅ | 0=internal, 1=public, 2=private |
published |
✅ | ✅ | |
created_at / updated_at |
✅ | ✅ | ISO 8601 |
url |
✅ | ✅ | Public-facing URL |
keywords [] |
✅ | ✅ | Tag objects |
answer [].body |
✅ | ✅ | Raw HTML |
answer [].body_txt |
✅ | ✅ | Plain text strip |
answer [].format |
✅ | ✅ | |
answer [].updated_at |
✅ | ✅ | |
answer [].processed_body |
❌ | ✅ with ?processed=true |
Embedded articles expanded |
| All associated categories | ❌ | ❌ | Use categorizations.csv |
| Draft body (unpublished changes) | ❌ | ❌ | Not exposed via API |
The answer [] array structure explained: Each article has an array of answer records. Multiple entries occur when an article has language variants (each language gets its own answer record) or in some versioning scenarios. For a monolingual KB, most articles will have exactly one entry. For multilingual KBs, filter by the answer's associated language_id to get the correct version.
What the Article JSON Object Looks Like
Here is a representative (truncated) API v3 response for a single article fetch with ?processed=true:
{
"question": {
"id": 48291,
"name": "How to Reset Your Password",
"description": "Step-by-step guide for resetting account passwords.",
"codename": "how-to-reset-your-password",
"views": 1842,
"accessibility": 1,
"published": true,
"created_at": "2024-03-12T09:14:22.000Z",
"updated_at": "2025-06-01T14:33:07.000Z",
"url": "https://yourcompany.helpjuice.com/en_US/account/48291-how-to-reset-your-password",
"keywords": [
{ "id": 112, "name": "password" },
{ "id": 113, "name": "account access" }
],
"answer": [
{
"id": 91045,
"question_id": 48291,
"user_id": 7,
"format": "wysiwyg",
"body": "<p>To reset your password...</p><img src=\"https://static.helpjuice.com/helpjuice_production/uploads/example.png\">",
"body_txt": "To reset your password...",
"processed_body": "<p>To reset your password...</p><img src=\"https://static.helpjuice.com/helpjuice_production/uploads/example.png\">",
"updated_at": "2025-06-01T14:33:07.000Z"
}
]
}
}Note: processed_body differs from body only when the article contains embedded article references (Helpjuice's internal block feature). When no embedding is present, both fields are identical. Use the presence of a mismatch between body and processed_body as your detection signal for embedded content.
Filtering Articles
The /api/v3/articles endpoint supports filters useful for incremental or staged exports:
| Filter | Type | Example | Notes |
|---|---|---|---|
created_since |
Date | ?created_since=20-09-2024 |
DD-MM-YYYY format |
updated_since |
Date | ?updated_since=01-01-2026 |
DD-MM-YYYY format |
updated_upto |
Date | ?updated_upto=31-12-2025 |
DD-MM-YYYY format |
category_id |
Integer | ?category_id=123 |
|
filter [accessibility] |
Integer | ?filter [accessibility]=1 |
0=internal, 1=public, 2=private |
filter [is_published] |
Boolean | ?filter [is_published]=true |
|
filter [language] |
String | ?filter [language]=en_us |
Lowercase in article filters |
Watch for date format inconsistencies. Article list filters use DD-MM-YYYY (?updated_since=20-09-2024), while analytics endpoints document YYYY-MM-DD (?since=2024-09-20). Language parameter casing also varies: article filters use en_us (lowercase), while category and translation documentation uses en_US (mixed case). Test each filter with a small batch before running a full export, and verify returned record counts against your known totals. (help.helpjuice.com)
The Analytics API
Helpjuice exposes search and engagement analytics through a separate API surface that follows the same authentication and pagination rules as v3. Key endpoints:
| Endpoint | Returns |
|---|---|
/api/v3/analytics/searches |
Search query log with result counts |
/api/v3/analytics/keywords |
Aggregated keyword performance |
/api/v3/analytics/articles |
Per-article view and engagement metrics |
/api/v3/analytics/categories |
Per-category traffic metrics |
/api/v3/analytics/users |
Per-user engagement data |
/api/v3/analytics/groups |
Per-group engagement data |
The Analytics API caches results for 1 hour and supports explicit date filters (since and upto in YYYY-MM-DD format). Always pass explicit date ranges — omitting them causes Helpjuice to apply default windows that may not cover your full dataset. Maximum page size is 1,000 records, same as v3.
curl --get -H "Authorization: $HELPJUICE_API_KEY" \
--data-urlencode "since=2026-08-01" \
--data-urlencode "upto=2026-08-14" \
--data-urlencode "limit=1000" \
"https://yourcompany.helpjuice.com/api/v3/analytics/searches"Export analytics only if the destination platform can use it — for search-term analysis, content pruning, or redirect planning. Keep the analytics payload separate from your content payload so the migration mapping stays clean.
The Legacy API v2
Helpjuice maintains its older API at /api/ (no version prefix). It exposes four endpoints: /api/questions, /api/answers, /api/categories, and /api/searches. These support .xls, .csv, and .json response formats (append the extension to the URL). Pagination uses ?page=X&limit=Y with a default of 250 records and a maximum of 1,000 per page.
curl "https://yourcompany.helpjuice.com/api/questions.json?api_key=YOUR_KEY&limit=1000&page=1"Capability comparison — v2 vs. v3:
| Capability | API v2 | API v3 |
|---|---|---|
| Article metadata | ✅ /questions |
✅ /articles |
| Article body content | ✅ separate /answers call |
✅ included in /articles |
| Users, groups, webhooks | ❌ | ✅ |
| Activities, settings, backups | ❌ | ✅ |
| Date-range filters | ❌ | ✅ |
| Documented rate limit | ❌ (implement backoff defensively) | ✅ 100 req/min |
| Response format options | JSON, CSV, XLS | JSON only |
The only reason to use v2 is if you specifically need XLS output or if legacy scripts already depend on it. For any new migration or integration work, use v3 exclusively.
Handling Multilingual Knowledge Bases
Helpjuice supports 50+ languages and allows articles to be translated. Both API versions support language scoping:
API v3: Add ?filter [language]=es_es (lowercase) to filter articles by language. When fetching a single article with ?kb_language=es_ES, Helpjuice returns the Spanish version if it exists, otherwise falls back to the default language version. Critically, the fallback behavior means you cannot rely on the presence of a response to confirm a translation exists — you must compare the returned language_id or language_code against what you requested.
API v2: Insert the language code into the URL path: /api/en_US/questions.
Migration implications for multilingual KBs:
- Export each language separately with explicit language filters.
- The v3 API does not return a
translation_oforsource_article_idfield — there is no parent-child link between translations in the API response. - Map translations by matching
codenamevalues across language-scoped exports. Articles that are translations of the same source share the samecodename. - When Helpjuice syncs updated content for translation, the entire article is retranslated, not just the changed sections. If you export, modify, and re-import multilingual content during the same migration window, re-trigger translation after content changes are finalized.
The Asset Extraction Problem
The most complex part of a Helpjuice migration is not getting the text out — it is handling embedded assets.
When authors upload images to a Helpjuice article, those images are hosted on Helpjuice's infrastructure. The API returns article bodies containing HTML like this:
<p>To reset your password, click the gear icon:</p>
<img src="https://static.helpjuice.com/helpjuice_production/uploads/your/image.png" alt="Settings Gear">If you push this HTML directly into a target platform like Freshdesk or Zendesk Guide, the images will render initially. But once your Helpjuice account is deactivated, those CDN URLs die — resulting in broken images across your entire new knowledge base.
The backup zip includes uploaded media in the categories/ folder, which helps. But if you are building your extraction from the API, you must parse the HTML of every article, download the assets, and rewrite the URLs.
Parse and Download
from bs4 import BeautifulSoup
import requests
import os
import time
HELPJUICE_DOMAINS = ("static.helpjuice.com", "helpjuice.com")
def extract_and_download_assets(html_body, article_id, output_dir="./assets"):
"""
Parses HTML body, downloads all Helpjuice-hosted assets,
and returns modified HTML with local file paths as placeholders.
Replace placeholder paths in a second pass after upload to target platform.
"""
soup = BeautifulSoup(html_body, 'html.parser')
os.makedirs(output_dir, exist_ok=True)
# Handle img tags and anchor tags pointing to downloadable files
for tag, attr in [("img", "src"), ("a", "href"), ("video", "src")]:
for element in soup.find_all(tag):
url = element.get(attr)
if not url or not any(domain in url for domain in HELPJUICE_DOMAINS):
continue
try:
resp = requests.get(url, timeout=30)
resp.raise_for_status()
filename = f"{article_id}_{url.split('/')[-1].split('?')[0]}"
filepath = os.path.join(output_dir, filename)
with open(filepath, 'wb') as f:
f.write(resp.content)
element[attr] = f"__ASSET_PLACEHOLDER__{filepath}"
time.sleep(0.1) # Be a considerate client
except requests.RequestException as e:
print(f"Failed to download {url}: {e}")
# Leave original URL; flag for manual review
return str(soup)Upload and Rewrite
During the import phase to your new platform:
- Upload each saved asset to the target platform's storage or an independent CDN.
- Capture the new URL returned by the target system's upload API.
- Run a string replacement pass on the HTML body, replacing
__ASSET_PLACEHOLDER__./assets/filenamewith the new URL. - Push the rewritten HTML body when creating the article in the target platform.
Resolving Internal Knowledge Base Links
Knowledge base articles frequently reference one another. In Helpjuice, an internal link in the article HTML looks like:
<a href="/articles/12345-how-to-configure-sso">SSO Setup Guide</a>When you migrate to a new platform, that article receives a completely new ID and URL. If you do not remap these links, users clicking "SSO Setup Guide" in the new system will hit a 404.
The Multi-Pass Strategy
- Pass 1 (Structure): Create all articles in the target platform as drafts or placeholders. Capture the mapping:
helpjuice_article_id→target_article_idandtarget_url. Store this as a lookup dictionary. - Pass 2 (Content Scan): Iterate through all Helpjuice HTML bodies. Use a regex to find
hrefattributes containing/articles/patterns and extract the numeric ID from the slug format (/articles/12345-slug-text). - Pass 3 (Rewrite): For each matched Helpjuice ID, look up the new
target_urlin your mapping dictionary and replace thehrefvalue. Log any IDs without a mapping — these are references to deleted or inaccessible articles. - Pass 4 (Update): Push the updated HTML body to the target platform to replace the placeholder content.
import re
def rewrite_internal_links(html_body, id_map):
"""
id_map: dict of {helpjuice_article_id (int): new_target_url (str)}
"""
def replace_link(match):
article_id = int(match.group(1))
new_url = id_map.get(article_id)
if new_url:
return f'href="{new_url}"'
else:
print(f"Warning: No mapping for Helpjuice article ID {article_id}")
return match.group(0) # Leave original if no mapping found
pattern = r'href="/articles/(\d+)[^"]*"'
return re.sub(pattern, replace_link, html_body)HTML Formatting and Sanitization
Helpjuice provides a WYSIWYG editor, which means the underlying HTML can contain complex nested <div> structures, inline CSS styles, and custom table formatting.
Many target platforms (like Zendesk Guide or Intercom) have strict HTML sanitization rules that will strip inline style attributes, custom classes, or unsupported tags like <iframe>.
Before pushing Helpjuice HTML into a new system:
- Strip inline styles: Convert inline CSS (e.g.,
<span style="font-weight: bold;">) to semantic HTML (<strong>). Python'sbleachlibrary with a customcss_sanitizerhandles this. - Check iframe whitelists: If your articles contain embedded YouTube or Loom videos via
<iframe>, verify the target platform allows iframes from those domains. If not, the video content silently disappears on import. - Normalize tables: Ensure tables use standard
<thead>,<tbody>,<tr>, and<td>tags. Malformed tables from older articles will break target platform parsers. Run through an HTML parser before import to surface structural issues. - Check for Helpjuice-specific custom components: Some WYSIWYG extensions (callouts, alerts) may render as non-standard HTML. Identify and transform these before import.
Edge Cases That Break Migrations
Internal blocks need processed_body
Helpjuice allows embedding one article inside another. The raw body field stores a placeholder reference (not the embedded content). Only the processed_body field (available via ?processed=true on individual article GETs) renders the embedded content inline. Detection: compare body length to processed_body length — a significant difference indicates embedded content.
Article-to-category mapping is many-to-many
Helpjuice's "Also Display In" feature lets a single article appear in multiple categories. The categorizations.csv in the backup captures all associations. The API v3 GET response for an individual article includes the primary category URL but does not return all associated categories as a structured field. Use the backup CSV as your authoritative source for category mapping — the API alone will silently drop secondary category associations.
Draft vs. published content
The published field is boolean, but Helpjuice allows articles to have published content and pending draft changes simultaneously. The API returns the published version by default. There is no documented API endpoint to retrieve the in-progress draft body when a published version already exists. If draft preservation is part of your migration scope, this requires manual handling or direct Helpjuice support engagement.
Private and internal content scoping
Articles with accessibility set to 0 (internal) or 2 (private) require authentication to retrieve. A Super Admin API key returns all content. User impersonation via HTTP Basic Auth scopes the response to that user's permissions — which may silently exclude private content from your export without any error indication. Validate your export counts against known totals before considering the extraction complete.
Helpjuice enforces rules about what content can live inside public, internal, and private categories. Flattening content without carrying access rules forward risks overexposing internal knowledge in the destination platform. (help.helpjuice.com)
Revision history is not clearly exportable
Helpjuice supports article versions and revisions in the editor, but the standard export paths (backup zip and API) return only the current published state, not the version history. If editorial history is part of your compliance or audit scope, verify this separately with Helpjuice support before assuming the backup covers it. (help.helpjuice.com)
Deleted articles are recoverable for 90 days
Before taking a final snapshot, check the Activities area for recently deleted content. Helpjuice retains deleted articles for up to 90 days and allows restoration. Recover anything needed before starting the export — you cannot go back after account cancellation. (help.helpjuice.com)
Round-trip import constraints
Helpjuice's import documentation specifies .xls format — not .xlsx. Even though Helpjuice exports HTML-rich content and JSON via API, a direct reverse import path does not exist without a transform layer. For complex round-trip scenarios, engage Helpjuice's import team before assuming the format will be accepted. (help.helpjuice.com)
Webhooks for continuous sync
Helpjuice API v3 supports webhooks for real-time event notifications on articles, categories, and users (create, update, delete). Configure them via POST /api/v3/webhooks with a url and event_types payload, and test with POST /api/v3/webhooks/:id/test. Webhook payloads follow the same JSON structure as the corresponding GET endpoint responses. Retry behavior and delivery guarantees are not documented in Helpjuice's official reference — implement idempotent receivers and use updated_at timestamps to detect duplicate deliveries.
Building a Migration-Ready Export: Step by Step
Here is the complete sequence for extracting a Helpjuice knowledge base for migration:
-
Get the right access. You need Super Administrator or account owner access for Backup & Restore and API credentials. Confirm your API key returns the expected total article count before proceeding.
-
Restore deleted content. Check Activities for articles deleted within the last 90 days. Restore anything needed before the snapshot.
-
Download the backup zip. This gives you uploads, categorizations, groups, and permissions in one shot. Store an untouched copy as your rollback point. Note the
completed_attimestamp. -
Export all articles via API v3 with
?limit=1000pagination. Validatemeta.total_countmatches your known article count. -
Detect and fetch articles with embedded content. Compare
bodylength vsprocessed_bodylength on a sample. For any article where they differ, fetchGET /api/v3/articles/:id?processed=trueto get the expanded content. -
Export categories, users, and groups via API v3. The category response includes
published_questionsanddraft_questionsarrays. Mapuser_idto name and email for author attribution. -
Parse and download all media assets. Scan all
bodyHTML fields forsrcandhrefattributes pointing tostatic.helpjuice.com. Deduplicate URLs before downloading. Rewrite to placeholder tokens for the second-pass URL update. -
Cross-reference
categorizations.csvfrom the backup to identify articles in multiple categories. This data is not reliably available via API alone. -
Map and rewrite internal links. Use the multi-pass strategy above. Log any unmapped IDs for manual review.
-
Sanitize HTML for the target platform's requirements — strip inline styles, normalize tables, verify iframe compatibility, transform custom components.
-
Export analytics if you need search intent data for content gap analysis or redirect planning. Keep this payload separate from content.
-
Validate in the target. Spot-check article HTML, slugs, access levels, category hierarchy, translations, and attachments. Confirm image rendering and internal link resolution before cutover.
Do not cancel your Helpjuice subscription until you have performed a full test migration, validated that all inline images render correctly on the new platform, and confirmed that internal links route to active articles rather than 404 pages.
API v3 vs. Backup vs. Dashboard Export: Which to Use When
| Scenario | Best Method | Why |
|---|---|---|
| Full platform migration | API v3 + Backup zip | API gives structure; backup gives media + categorizations |
| Quick content audit | Dashboard XLS/CSV | Fastest, no code needed |
| Offline documentation archive | PDF/DOCX export | Rendered, branded output |
| Incremental sync to another system | API v3 with updated_since |
Date filters + JSON = automation-friendly |
| Disaster recovery | Backup zip | Most complete single download |
| Analytics review | Dashboard CSV or Analytics API | Either works; API is automatable |
| Continuous sync | API v3 + Webhooks | Webhooks push events in real time |
| Multilingual extraction | API v3 per-language + backup | Match translations by codename across language exports |
| Access-controlled content audit | API v3 with Super Admin key | Impersonation may silently exclude private content |
Summary: What Helpjuice Exports Well and Where the Gaps Are
Helpjuice's export surface is better than many knowledge base platforms — you can get meaningful structured data out through multiple channels without severe vendor lock-in. The documented rate limit (100 req/min), clean JSON responses, date-range filters, and backup zip together give you a complete extraction path.
The real friction points are:
- Media assets have no API endpoint — CDN URLs must be parsed and downloaded separately.
- Multi-category mappings are only complete in the backup's
categorizations.csv— not in API responses. processed_bodyis only available on single-article GETs with?processed=true, requiring N additional requests beyond the bulk list.- Draft content is not accessible when a published version exists.
- Translation relationships (parent-to-translation linking) must be inferred from matching codenames across language-scoped exports.
- Revision history is not part of any standard export path.
For a KB with hundreds of articles, basic extraction is straightforward. The engineering effort scales with embedded content, multilingual variants, complex category hierarchies, and the strictness of the target platform's HTML sanitization. The text extraction is the easy part — the field mapping, asset re-hosting, link rewriting, and access-level translation to the destination platform's permission model is where migrations fail.
For broader context on migration planning, see our knowledge base migration checklist and our overview of help desk migration tools and services. If you are considering running the entire migration through spreadsheets, read Using CSVs for SaaS Data Migrations first.
Frequently Asked Questions
- Does Helpjuice have a data export feature?
- Yes. Helpjuice offers four export methods: a full backup zip (CSV files plus media), individual XLS/CSV exports for articles, categories, users, searches, and activities from the admin dashboard, per-article PDF/DOCX/HTML exports, and a REST API v3 that returns structured JSON. A separate Analytics API handles search and engagement data.
- What is the Helpjuice API rate limit?
- Helpjuice API v3 allows 100 requests per minute. Pagination supports up to 1,000 records per page with a default of 25. The legacy API v2 has no documented rate limit — implement exponential backoff on 429 responses as a defensive measure.
- How do I export all articles from Helpjuice via API?
- Use GET /api/v3/articles with ?limit=1000 and paginate through pages until the current page equals total_pages in the response meta object. Authenticate with your API key in the Authorization header. Each response includes article metadata, body HTML, plain text, and keywords.
- Does the Helpjuice export include images and attachments?
- The backup zip includes uploaded media files in a categories folder. The API returns article bodies as HTML containing image URLs hosted on Helpjuice's CDN (static.helpjuice.com). There is no dedicated media download API endpoint — you must parse image URLs from article HTML and download them separately.
- Can I export a multilingual Helpjuice knowledge base?
- Yes. API v3 supports language filtering with ?kb_language=es_ES or ?filter[language]=es_es. You must export each language separately. Helpjuice does not expose a translation-linking field, so you need to map translations by matching article codenames or IDs across language-scoped exports.