How to Export Data from Charlie (CharlieHR): Methods, API & Limits
Complete guide to exporting data from Charlie (CharlieHR): GDPR export, CSV reports, REST API endpoints, rate limits, and what data you can't get out.
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 Charlie (CharlieHR): Methods, API & Limits
TL;DR — Charlie (CharlieHR) Data Export
You can export most of your data from Charlie, but it takes multiple methods to get everything. The fastest path for full coverage is the GDPR full account export — available to Super Admins only — which dumps all company data (employees, salaries, leave requests, documents, reviews, polls, checklists, handbook, key dates) into an XML archive that auto-deletes after one week. For structured, field-level data, Charlie's built-in reports export to CSV and cover team members, time off, payroll, and sick leave. The REST API (/team_members, /salaries, /offices, /leave_requests) gives programmatic access with token auth, but rate limits are not publicly documented and many list endpoints cap per_page at 25. The biggest limitation: no single "Export All to CSV" button exists, and richer content objects like documents, reviews, polls, checklists, and handbook content are not exposed in the public API. For a full-fidelity extraction, plan on combining CSV, XML, and API pulls.
Disclosure: This guide is published by ClonePartner, an HRIS migration services provider. We have a commercial interest in migration projects. All technical claims are sourced from Charlie's public documentation and direct API testing.
Charlie (formerly CharlieHR) is an HRIS platform built for UK-based small businesses with roughly 10–250 employees. Its data model centers on Team Members, Salaries, Time Off, Documents, Performance Reviews, Engagement Polls, Teams, Offices, Custom Cards, Key Dates, Onboarding/Offboarding Checklists, and the Company Handbook. When it comes time to migrate to a mid-market or enterprise HRIS — BambooHR, Workday, Rippling — you will find that getting structured text data out is straightforward, but extracting documents, reviews, and configuration-level objects requires extra effort.
This guide covers exactly what you can extract, every export method available, the API endpoints and their constraints, and the known gaps in Charlie's data portability. It covers the core Charlie HRIS, not the separate Charlie Recruit add-on. (Charlie Recruit has its own candidate data store; if you use it, plan a separate extraction — Recruit's export paths are not covered here.)
What Data Can You Export from Charlie?
Before planning an extraction, map Charlie's data model. The exportability of each object depends entirely on which method you use. No single method covers everything. (help.charliehr.com)
| Object | Reports Export (CSV) | GDPR Full Export (XML) | API Export (JSON) | Known Limitations |
|---|---|---|---|---|
| Team Members | Yes (basic + full reports) | Yes | Yes (GET /team_members) |
CSV flattens relationships; API pagination via page/per_page |
| Salaries / Payroll | Yes (payroll report) | Yes | Yes (GET /salaries) |
Salary Changes report only shows current + last active salary; use API for full history (help.charliehr.com) |
| Time Off / Leave Requests | Yes (summary + detail reports) | Yes | Yes (GET /leave_requests) |
CSV summary reflects current-day balances only — no historical point-in-time snapshots |
| Leave Allowances & Adjustments | Partial | Yes | Yes (GET /leave_allowances, allowance adjustments) |
Time Off Overview is current-state only; adjustments need API |
| Leave Types, Company Holidays | Partial | Yes | Yes (GET /leave_types, GET /company_holidays) |
No dedicated CSV export path documented |
| Sick Leave | Yes (dedicated report) | Yes | Partial | Rolling 12-month and holiday-year views; no standalone API endpoint documented |
| Bank Accounts | Partial | Yes | Yes (GET /bank_accounts) |
Sensitive payroll field — handle with care |
| Documents (contracts, payslips, policies) | No | Yes (bundled as files in folders) | No | Cannot be bulk-downloaded via API; GDPR export is the only extraction path |
| Performance Reviews | Yes (completed cycles only) | Yes | No | Export via Grow → Reviews → History for completed cycles (help.charliehr.com); in-progress reviews cannot be exported |
| Engagement Polls | Yes (per-poll export) | Yes | No | Results exportable when poll closes; no bulk all-polls export |
| Teams / Org Structure | Partial (via team member reports) | Yes | Partial (GET /teams, team data on member objects) |
Org chart is viewable but not directly exportable (help.charliehr.com) |
| Offices | No | Yes | Yes (GET /offices) |
Returns ID, name, head office flag, address, timezone, phone, email |
| Working Locations & Working Weeks | Partial | Yes | Yes (GET /working_locations, /working_weeks) |
Working weeks are separate from profile data; Charlie uses them to pro-rate leave |
| Custom Cards | No | Yes | No | Values stored on team member profiles; not in CSV reports or API |
| Onboarding Checklists | No | Yes | No | Checklist structure and completion status only in GDPR export |
| Key Dates | No | Yes | No | Birthdays, work anniversaries, probation end dates — GDPR export only |
| Handbook | No | Yes | No | Full handbook content in GDPR XML export |
| Note Types | No | Yes | Yes (GET /team_member_note_types) |
API returns note type ID, name, type, and permission settings |
| Diversity Data | Aggregate only | Aggregate only | No | Individual responses intentionally unavailable; minimum group thresholds protect anonymity (help.charliehr.com) |
Fully exportable: core structured HR data — team members, payroll fields, leave records, teams, offices, working locations. Partially exportable: documents, reviews, polls, checklists, and handbook content — they exist in the GDPR export but not in a clean public API. Not cleanly exportable: the org chart visual layout and individual diversity responses.
[For engineering] The API omits documents, performance reviews, engagement polls, custom cards, onboarding checklists, and handbook content entirely. If you need these objects programmatically, the GDPR export XML is your only extraction path — and it requires custom parsing.
How Charlie Compares: Export Portability vs. Other SMB HRIS Platforms
Charlie's export capabilities are typical for a sub-250-employee HRIS but lag behind some competitors in API breadth and document handling. This comparison covers the core export dimensions that matter for migration planning.
| Capability | Charlie (CharlieHR) | BambooHR | Personio | HiBob |
|---|---|---|---|---|
| CSV report exports | Yes — pre-built + custom reports | Yes — extensive custom reporting | Yes — configurable report builder | Yes — custom reports with filters |
| Full account export | Yes — GDPR export (XML) | No native full-account dump; per-report CSV only | Yes — GDPR export available | Partial — GDPR export via support request |
| REST API coverage | Partial — team members, salaries, leave, offices, teams. No documents, reviews, polls | Broad — employees, time off, files, reports, goals, training. Document download via API | Moderate — employees, absences, attendances, documents. Document download supported | Broad — employees, payroll, documents, time off, tasks. Document download via API |
| Document export via API | ❌ Not available | ✅ GET /files/{id} |
✅ Document download endpoints | ✅ Document download endpoints |
| Webhook support | ❌ Not available | ✅ Native webhooks for employee changes | ✅ Webhooks for 15+ event types | ✅ Webhooks for employee lifecycle events |
| Published rate limits | ❌ Not documented | ✅ Documented (requests per minute/day) | ✅ Documented (varies by plan) | ✅ Documented (varies by endpoint) |
| API pagination max | 25 per page on many endpoints | 100–200 per page typical | Configurable, typically up to 200 | Up to 100 per page |
Key takeaway: Charlie's structured HR data exports cleanly via CSV and API, matching its SMB peers. The gaps that create migration friction — no document API, no webhooks, undocumented rate limits, 25-record pagination cap — are areas where BambooHR, Personio, and HiBob offer more mature developer tooling. The GDPR full-account XML export partially compensates by covering objects the API misses, but it requires custom XML parsing that the other platforms' APIs make unnecessary.
Export Methods: Every Way to Get Data Out of Charlie
Charlie offers three native extraction paths — Reports (CSV), the full GDPR account export (XML), and the REST API (JSON) — plus third-party integration options. No single method covers 100% of the data model. (help.charliehr.com)
| Method | Data Coverage | Volume Limit | Speed | Complexity | Best For |
|---|---|---|---|---|---|
| Reports Export (CSV) | Team members, salaries, time off, sick leave, new starters/leavers, contacts, payroll | No documented cap (designed for SMBs <250) | Seconds | Low | Non-technical admins needing structured data |
| Feature CSV Exports | Completed reviews, individual poll results | No documented cap | Seconds | Low | One-off HR content exports |
| Full GDPR Export (XML) | All company data: employees, salaries, documents, reviews, polls, handbook, checklists, key dates | Entire account | Minutes (email notification when ready) | Low | Full backup, compliance, or migration baseline |
| REST API (JSON) | Team members, salaries, leave requests, allowances, offices, teams, working locations, note types, bank accounts | per_page max 25 on many endpoints; no published rate limit |
Moderate | Medium–High | Developers building integrations or automated extraction |
| Unified APIs (Apideck, Merge, Finch, Bindbee) | Employees, employment, company, pay data | Varies by provider | Moderate | Medium | Product teams building multi-HRIS integrations |
[For PMs] Reports Export, feature-specific CSV exports, and the GDPR Export require zero engineering — any Super Admin or Admin can do them from the Charlie UI. The API route requires a developer.
How to Export Employee Data from Charlie's UI (Step-by-Step)
Permissions matter: company CSV exports are limited to Super Admins, Admins, and Payroll Admins. The full account export and review export are Super Admin only. (charliehr.com)
Pre-Built Reports Export
- Log in as a Super Admin, Admin, or Payroll Admin
- Click the Reports tab in the left navigation
- Select a pre-built report: Team Member (basic or full), Payroll, Time Off Summary, Time Off Detail, Sick Leave, New Starters & Leavers, Addresses, Emergency Contacts, or Email & Phone Numbers
- Click "Export Data" — the report downloads as a CSV file
- Previously exported reports are available at the bottom of the Reports page for re-download — Charlie shows who downloaded them and when
Custom Reports Export
- Go to Reports → click "New" under Custom Reports
- Choose report type: Team Member Information or Time Off Trends
- Select the fields you want to include
- Optionally toggle "Include archived employees" to capture leavers
- Name the report, click Save
- Click "Go to your report" → then "Export Data"
The CSV includes only the fields you selected. You can edit the report later to add or remove fields, then re-export. (help.charliehr.com)
What CSV reports miss: Documents, custom card data, onboarding checklists, handbook content, and key dates are not available in any CSV report. The time off summary report reflects balances as of the current day — you cannot generate a point-in-time historical snapshot.
Exporting Completed Reviews
Go to Grow → Reviews → History, open a completed cycle, and click Export Review. Charlie generates a CSV, but the documented export path covers completed review cycles only — in-progress reviews cannot be exported. (help.charliehr.com)
Exporting Poll Responses
Go to Engage → Polls & Surveys, open the poll, switch to Results, and click Export results. The output is CSV, and the export is per poll — there is no single button to export every poll in the account at once. (help.charliehr.com)
Individual Team Member Export
Charlie lets Super Admins and Admins export all data for a single team member as a CSV. Navigate to the team member's profile and use the export option. This is useful for Subject Access Requests (SARs) but impractical for bulk extraction across the full org.
How to Request a Full GDPR Export from Charlie
The GDPR full account export is the most complete extraction method Charlie offers. It produces an XML-based archive containing all company data. (help.charliehr.com)
Steps:
- Log in as a Super Admin (only Super Admins can trigger this)
- Navigate to Company Settings
- Scroll to the "Request full account export" button and click it
- Wait for the email notification confirming the export is ready
- Click the link in the email to return to Charlie, then click Download
What you get:
- A file containing various folders plus a
company.xmldocument with the majority of your account data - Included data: handbook, all leave requests, all documents, salaries, report exports, reviews, polls, checklists, and key dates
- Format: XML
- The export file auto-deletes from Charlie after one week — download it immediately and store it externally
GDPR Export XML Structure (Representative Sample)
The XML schema is not publicly documented by Charlie. Based on actual export inspection, the company.xml file follows a structure similar to this anonymized excerpt:
<?xml version="1.0" encoding="UTF-8"?>
<company>
<name>Acme Ltd</name>
<team_members>
<team_member>
<id>tm_abc123</id>
<first_name>Jane</first_name>
<last_name>Smith</last_name>
<email>jane.smith@acme.com</email>
<start_date>2021-03-15</start_date>
<job_title>Product Manager</job_title>
<team>Engineering</team>
<office>London HQ</office>
<line_manager_email>bob.jones@acme.com</line_manager_email>
<salaries>
<salary>
<amount>55000</amount>
<currency>GBP</currency>
<effective_date>2023-01-01</effective_date>
<pay_period>annually</pay_period>
</salary>
<salary>
<amount>50000</amount>
<currency>GBP</currency>
<effective_date>2021-03-15</effective_date>
<pay_period>annually</pay_period>
</salary>
</salaries>
<custom_cards>
<card>
<name>Right to Work</name>
<fields>
<field><label>Document Type</label><value>Passport</value></field>
<field><label>Expiry Date</label><value>2028-06-30</value></field>
</fields>
</card>
</custom_cards>
</team_member>
</team_members>
<leave_requests>
<leave_request>
<team_member_id>tm_abc123</team_member_id>
<leave_type>Holiday</leave_type>
<start_date>2024-08-05</start_date>
<end_date>2024-08-09</end_date>
<status>approved</status>
<days_used>5.0</days_used>
</leave_request>
</leave_requests>
<handbook>
<section>
<title>Working Hours</title>
<content><![CDATA[Our standard working hours are 9:00–17:30...]]></content>
</section>
</handbook>
</company>Node names generally correspond to Charlie's UI field labels, but nesting depth and attribute names vary by object type. Custom cards use the card name and field labels as defined by the admin who created them — there is no standardized schema across accounts. Budget 2–4 hours of schema mapping per migration to build a reliable parser.
[For PMs] The GDPR export is your best starting point for any migration project. It contains objects that no other export method touches (reviews, checklists, handbook, documents). But the XML format requires parsing before you can load it into a target system — budget time for transformation.
Is There an API to Bulk Export Charlie Data? [For Engineering]
Yes. Charlie provides a RESTful API (currently at v1 — no v2 has been announced or documented) for programmatic access, but it covers a subset of the data model — primarily team members, salaries, leave, offices, teams, and working data. It is a standard REST API with pagination, not a one-shot bulk dump. (charliehr.com)
How to Generate API Keys
- Log in as an Admin or Super Admin
- Expand the Company section in the side navigation
- Click Integrations
- Navigate to the API Access tab
- Follow the instructions to generate your API keys
Charlie only shows the key once — copy the Client ID and Client Secret safely when created. (help.charliehr.com)
Core API Endpoints
| Object Group | Endpoints |
|---|---|
| Team Members | GET /api/v1/team_members, GET /api/v1/team_members/:id, GET /api/v1/team_members/:id/notes |
| Payroll | GET /api/v1/salaries, GET /api/v1/team_members/:id/salaries, GET /api/v1/bank_accounts, GET /api/v1/bank_accounts/:team_member_id |
| Leave | GET /api/v1/leave_requests, GET /api/v1/team_members/:id/leave_requests, GET /api/v1/leave_allowances, GET /api/v1/team_members/:id/leave_allowance, GET /api/v1/team_members/:id/non_holiday_leave_allowances, GET /api/v1/team_members/:team_member_id/allowance_adjustments, GET /api/v1/leave_types |
| Org Structure | GET /api/v1/teams, GET /api/v1/offices |
| Calendars | GET /api/v1/company_holidays, GET /api/v1/restricted_dates |
| Hybrid Work | GET /api/v1/working_locations, GET /api/v1/team_members/:team_member_id/working_location, GET /api/v1/team_members/:team_member_id/working_weeks |
| Notes | GET /api/v1/team_member_note_types, GET /api/v1/team_member_note_types/:id |
Authentication
All requests require an Authorization header built from a Client ID and Client Secret. Based on Charlie's API documentation, the format is: (charliehr.com)
curl -H "Authorization: Token token=YOUR_CLIENT_ID:YOUR_CLIENT_SECRET" \
https://charliehr.com/api/v1/team_members?page=1&per_page=25Pagination
The API supports page-based pagination with two query parameters:
page— the page number (starts at 1)per_page— records per page
Many list endpoints cap per_page at 25. The working_weeks endpoint is explicitly unpaginated. Iterate until an empty page is returned or until you reach the total_pages value from the response metadata. (charliehr.com)
Rate Limits
Charlie's official documentation does not specify explicit rate limits. There are no published rate limit headers, documented thresholds, or Retry-After contract in the public API docs. In practice, start conservatively at 1–2 requests per second, implement exponential backoff, and watch for HTTP 429 responses. In testing against a ~100-employee account at 2 requests/second sustained over 15 minutes, no 429 responses were observed — but this is anecdotal and should not be treated as a guaranteed threshold. (charliehr.com)
Undocumented rate limits are a planning risk. Without published thresholds, you cannot calculate guaranteed throughput. For a 250-employee company, the /team_members endpoint will likely complete in a single paginated sweep (10 pages at 25/page). For repeated sync operations or fan-out across child endpoints (notes, salaries, leave per member), monitor response codes carefully. If you hit 429s, back off and retry — do not assume your initial testing rate is universally safe.
No Webhook Support — Polling Alternatives
Charlie's API does not natively support webhooks. For near-real-time sync, you must implement polling. Recommended approach:
- Poll
/team_membersevery 15–60 minutes and compare against your local cache usingupdated_attimestamps (if present in the response) or full-record diffing - Poll
/leave_requestsdaily with date-range filters to detect new or changed requests - Store ETags or last-modified timestamps locally to minimize unnecessary full pulls
- For ongoing product integrations, consider a unified API provider (Merge, Apideck) that may abstract polling into webhook-like callbacks on their side
Code Example: Full Team Member Export with Retry Logic
import requests
import time
import json
BASE = 'https://charliehr.com/api/v1'
HEADERS = {'Authorization': f'Token token={CLIENT_ID}:{CLIENT_SECRET}'}
def get_pages(path, extra=None):
page = 1
extra = extra or {}
retries = 0
while True:
params = {'page': page, 'per_page': 25, **extra}
r = requests.get(
f'{BASE}{path}',
headers=HEADERS,
params=params,
timeout=30
)
if r.status_code in (429, 500, 502, 503, 504):
retries += 1
wait = min(60, 2 ** retries)
print(f"Rate limited or server error on {path} page {page}. "
f"Waiting {wait}s (retry {retries})")
time.sleep(wait)
continue
r.raise_for_status()
retries = 0 # Reset on success
body = r.json()
for row in body.get('data', []):
yield row
meta = body.get('meta')
if not meta or page >= meta.get('total_pages', page):
break
page += 1
time.sleep(0.5) # Conservative pacing — 2 req/sec
# Export team members with child objects
team_members = list(get_pages('/team_members'))
print(f"Exported {len(team_members)} team members")
for tm in team_members:
tm_id = tm['id']
tm['_notes'] = list(get_pages(f'/team_members/{tm_id}/notes'))
tm['_leave_requests'] = list(get_pages(f'/team_members/{tm_id}/leave_requests'))
salaries_resp = requests.get(
f'{BASE}/team_members/{tm_id}/salaries',
headers=HEADERS,
timeout=30
)
salaries_resp.raise_for_status()
tm['_salaries'] = salaries_resp.json().get('data', [])
time.sleep(0.5)
# Write to file
with open('charlie_export.json', 'w') as f:
json.dump(team_members, f, indent=2, default=str)At 25 records per page, exporting 250 team members takes 10 top-level requests before fan-out to child objects (notes, salaries, leave history, working weeks). The real time cost is the child-object fan-out: 250 members × 3–4 child endpoints = 750–1,000 requests, which at 2 req/sec takes approximately 6–8 minutes.
Three Migration Gotchas from the API
- Salary history: The Salary Changes CSV report only includes the current salary plus the last active salary. If you need full salary history (common for regulated industries and compensation analytics), you must use
GET /team_members/:id/salariesvia the API. (help.charliehr.com) - Working weeks: Charlie uses working weeks to pro-rate leave. They are a separate object from the team member profile. Preserve them explicitly during migration, or leave balances in the destination system will not reconcile. Charlie does not support irregular working weeks as a first-class model. (help.charliehr.com)
- API versioning: All endpoints use
/api/v1/. No v2 has been announced or documented as of this writing. If you are building a durable integration, pin to v1 and monitor Charlie's changelog for deprecation notices.
What the API Does Not Cover
The API does not expose endpoints for:
- Documents (contracts, payslips, uploaded files)
- Performance reviews
- Engagement polls
- Custom cards
- Onboarding/offboarding checklists
- Handbook content
- Key dates
- Org chart relationships as an independent object (line manager data may be on the team member object, but the chart is not queryable)
- Webhooks — Charlie's API does not natively support webhooks. For real-time sync, you must implement polling (see polling recommendations above).
Does Charlie Export Include Documents and Attachments?
Charlie stores documents directly on team member profiles — contracts, payslips, DBS certificates, policies, and other uploaded files. Standard CSV report exports do not include documents. The only native path to extract documents is the full GDPR account export, which bundles them as files within the downloaded archive. (help.charliehr.com)
There is no API endpoint for bulk-downloading documents. You cannot programmatically iterate over attachments and download them individually through the Charlie API. This is one of Charlie's most significant portability gaps compared to BambooHR (which offers GET /files/{id}), Personio, and HiBob — all of which support document download via their APIs.
External document links are a separate problem. If a Charlie document is a link to SharePoint, Google Drive, Dropbox, or OneDrive, Charlie is not storing the file binary — only the link. Export the Charlie record and the upstream file repository separately. (help.charliehr.com)
For migration work, treat documents as a second stream alongside structured HR records. After extraction, reconcile folders, permissions, and external links. Documents from the GDPR export must be individually re-uploaded to the target system's employee profiles unless you build custom tooling to automate the upload.
What Data Cannot Be Exported from Charlie?
Some data is either unavailable or only available with significant friction. Naming these gaps explicitly is essential for migration planning.
| Data Type | Exportable? | Workaround |
|---|---|---|
| Org chart visual layout | No | Rebuild from manager, teams, and office relationships in team member data (help.charliehr.com) |
| Individual diversity responses | No | Intentionally restricted to aggregate reporting — no company-side raw export by design (help.charliehr.com) |
| In-progress reviews | No | Export after the cycle closes (help.charliehr.com) |
| Workflow/automation configurations | No | Must be manually recreated in the target system |
| Integration configurations (Xero mappings, Slack settings) | No | Re-configure in the target platform |
| User permissions and role assignments | No (partial structure in GDPR export) | Document roles manually before migration |
| Dashboard analytics (headcount trends, retention metrics) | No | Computed views — re-derive from exported team member records |
| Audit logs (who accessed what, when) | No | Charlie maintains them internally but does not expose an export path |
| Custom card field definitions | No | Card values may appear in the GDPR export, but the schema (field labels, types, validation rules) must be manually documented |
| Irregular working weeks | No | Charlie does not support them as a first-class model; document exceptions outside Charlie (help.charliehr.com) |
| Deleted team member records | No | Permanent deletion is support-mediated and irreversible; export or archive before requesting deletion (help.charliehr.com) |
Performance review content is only available through the completed-cycle CSV export or the GDPR XML export. If your migration requires preserving review history (common in regulated industries or for continuity during performance improvement processes), plan for custom XML parsing to extract structured review data.
What Format Does Charlie Export Data In?
CSV reports: UTF-8 encoded CSV files. Column headers match the field names selected during report creation. Date formats follow DD/MM/YYYY (UK convention). Country codes use ISO 3166-1 alpha-2 format. (help.charliehr.com)
GDPR full export: XML format. The primary file is company.xml, which contains the bulk of structured data. Documents are organized in subfolders by team member. See the XML sample above for representative structure.
API responses: JSON. Salary records include fields like id, team_member_id, job_title, pay_rate, pay_period, pay_frequency, currency, effective_date, and employment_type. API date parameters use YYYY-MM-DD (ISO 8601), creating an inconsistency with CSV date formats that must be handled during transformation.
Common Data Quality Issues After Export
- Date format mismatches: Charlie uses
DD/MM/YYYYin CSVs butYYYY-MM-DDin API responses. Target systems (especially US-based HRIS platforms like BambooHR, Rippling, Gusto) often expectMM/DD/YYYYor ISO 8601. Validate date parsing before import — a date like03/04/2024is March 4th in the US but April 3rd in the UK. (help.charliehr.com) - Salary currency inconsistency: If your org has employees in multiple currencies, verify that the currency field is populated per record, not assumed as GBP based on company settings.
- Line manager references: Exported CSVs reference line managers by name and email. If a manager has left the company and been archived, the reference may point to a non-existent record in the target system. Resolve these dangling references before import.
- Custom card data in XML: Custom card values in the GDPR export use the card name and field labels as defined by the admin who created them. There is no standardized schema across accounts — the XML structure directly mirrors your account's configuration.
- External document links vs. files: Inventory uploaded files separately from external document links. External links (Drive, SharePoint, Dropbox, OneDrive) must be exported from the upstream repository.
Post-Export Validation Checklist
- Row count matches active + archived employee count in Charlie
- All salary records have valid ISO 4217 currency codes
- Date fields parse correctly in your target system's locale — convert
DD/MM/YYYYto ISO 8601 (YYYY-MM-DD) immediately after export - Documents from GDPR export open and are not corrupted — spot-check at least 10% of files
- Line manager references resolve to valid employee records (no dangling references to archived/deleted managers)
- Custom card values are present and correctly mapped to target system custom fields
- Time off balances reconcile with the current-day snapshot in Charlie's UI
- Salary history is complete (use API if the CSV report only shows current + last salary)
- Working week configurations are preserved for leave pro-rating
- Externally linked documents are accounted for separately from uploaded files
Export for Migration vs. Backup vs. Compliance
Your export strategy changes based on your objective. These three use cases look similar but require different scope, formats, and validation.
Migration to a New HRIS
You need structured, field-mapped data that can be imported into the target platform. Use the API for structured objects, CSV reports for quick reconciliation, and the GDPR XML export for content objects the API does not cover. Budget time for:
- ID mapping: Charlie's internal IDs (format:
tm_abc123) will not carry over. Map employee records by email address or employee number. - Relationship preservation: Line manager hierarchies, team assignments, and office mappings need explicit reconstruction. Rebuild from API fields, not flattened CSV labels.
- Document re-upload: Documents from the GDPR export must be individually re-uploaded to the target system's employee profiles.
- Salary history: Pull via the API if you need more than the current salary plus the last active salary.
- Working weeks: Preserve separately — they drive leave pro-rating logic.
For a deeper look at HRIS migration planning, see our HRIS Data Migration Checklist.
Full Backup
The GDPR export is the closest thing to a full-fidelity backup. Run it before any major change and store the download securely outside Charlie. The export link expires after one week — set a calendar reminder. For structured data redundancy, run CSV reports alongside the GDPR export.
GDPR Compliance and Data Subject Requests
Charlie is designed with UK GDPR compliance in mind. The platform supports Subject Access Requests (SARs) — you can export an individual team member's complete data file from their profile. The GDPR full export satisfies Article 20 data portability requirements at the company level. Charlie stores data on servers in Ireland (within the EEA), holds ISO 27001:2013 and Cyber Essentials certifications, and provides a Data Processing Addendum (DPA). (charliehr.com)
Note that Article 20 does not require Charlie to make its export technically compatible with your destination system — the obligation is to provide data in a structured, commonly used, machine-readable format. Charlie's CSV and XML outputs meet that standard; transformation is your responsibility.
For teams handling cross-border data portability, see our GDPR Compliant Data Migration blueprint.
How Portable Is Charlie Data? [For CTOs]
Data portability rating: Mostly Portable — strong on structured HR data, weak on content objects and developer tooling.
Here is the justification:
- Core employee data (demographics, contact info, salaries, employment history): fully exportable via CSV reports and API. Clean, structured, and ready for transformation.
- Time off data: exportable via CSV reports with current-day balances. Historical request-level detail available via API and GDPR export.
- Documents: exportable only via GDPR export (XML archive with files). No programmatic bulk download. Re-uploading to a target system is manual unless you build custom tooling. This is below the portability baseline set by BambooHR, Personio, and HiBob, all of which offer document download APIs.
- Performance reviews, polls, checklists: locked behind completed-cycle CSV exports and the GDPR XML export. Structured extraction from XML requires custom parsing.
- Workflow configurations, integrations, permissions: not exportable. Must be manually rebuilt.
- Developer tooling gaps: No webhooks, no documented rate limits, 25-record pagination cap, no document API. These gaps increase the engineering cost of any integration or migration project.
Contractually, Charlie's terms state the company does not own client data and will advise the client how to retrieve it on termination — but the client must retrieve it within 30 days. The terms also prohibit benchmarking and competitive monitoring. (charliehr.com)
The real switching cost is moderate for a company under 250 employees (Charlie's sweet spot). Core HR data transfers cleanly. The friction comes from documents, reviews, and any custom card data that needs schema mapping. Charlie does not impose contractual restrictions on data export itself — the GDPR export is available on all plans.
How Long Does a Full Charlie Export Take?
Charlie does not publish export SLAs or row caps for most UI exports. The main hard number in the public docs is the API page size cap of 25 on many endpoints. These estimates are based on hands-on experience with Charlie accounts in the 50–200 employee range, not vendor guarantees. (help.charliehr.com)
| Company Size | CSV Reports | GDPR Full Export | API Full Extract (incl. child objects) | Total Project (incl. transformation + validation) |
|---|---|---|---|---|
| Small (1–50 employees) | < 1 minute | 5–15 minutes | 10–30 minutes (~200–500 API calls) | 1–2 days |
| Medium (50–150 employees) | < 2 minutes | 15–30 minutes | 30–60 minutes (~500–2,000 API calls) | 2–5 days |
| Large (150–500 employees) | < 5 minutes | 30–60 minutes | 1–3 hours (~2,000–6,000 API calls) | 3–7 days |
Phase breakdown [For PMs]:
- Scoping (0.5 days): Identify which objects need exporting and in what format. Inventory custom cards, external document links, and review cycles.
- Access provisioning (< 1 hour): Ensure Super Admin access for GDPR export; generate API keys if needed
- Extraction (0.5–1 day): Run CSV reports + GDPR export + API calls
- Transformation (1–3 days): Parse XML, normalize date formats (
DD/MM/YYYY→ ISO 8601), map fields to target schema, extract and organize documents, resolve dangling line manager references - Validation (0.5–1 day): Run the post-export checklist above
Minimum team composition:
- UI exports only: 1 HR admin (no developer needed)
- API export: 1 developer familiar with REST APIs + 1 HR admin for validation
- Full migration: 1 developer + 1 PM + 1 HR admin
Third-Party Tools and Unified APIs for Charlie Export
If you are building a product that needs to read Charlie data (rather than doing a one-time export), unified HRIS APIs can abstract the integration:
- Apideck: Supports CharlieHR as a live connector via their HRIS Unified API. Covers employees and companies. Auth type: API key.
- Merge: Offers a CharlieHR connector supporting Employee, Employment, and Company objects.
- Finch: Lists CharlieHR as an Assisted integration for organization, payroll, and benefits data.
- Bindbee: Normalizes CharlieHR data into unified models across 65+ HRIS platforms.
These tools are designed for ongoing product integrations, not one-time migration exports. For a one-time full extraction, the native methods (GDPR export + CSV reports + direct API) are faster and more complete.
Make (formerly Integromat) has a community-developed CharlieHR app, but Make's own documentation notes that publicly available information about the app is limited. Treat it as best-effort, not production-grade.
When to Bring in Help
For a straightforward export of a sub-250-employee Charlie account, most HR teams can self-serve with the GDPR export and CSV reports. The complexity rises when you need to:
- Parse and transform XML into importable formats for a target HRIS (budget 1–3 days of developer time for schema mapping alone)
- Preserve document-to-employee associations across platforms (the GDPR export bundles files in folders, but folder-to-employee mapping requires parsing
company.xml) - Map custom card schemas that do not exist in the destination system
- Reconcile time off balances with historical accuracy across different leave-year configurations
- Pull full salary history via the API when CSV reports are incomplete
- Meet compliance timelines for GDPR data portability requests (Article 20 mandates response within 30 days)
- Handle external document links alongside Charlie-hosted files
Frequently Asked Questions
- Can I export all my data from Charlie?
- Yes. The full GDPR account export extracts all company data — employees, salaries, documents, reviews, polls, handbook, checklists, and key dates — as an XML archive. Only Super Admins can request it, and the download link expires after one week. For structured CSV output, use the built-in reports for team members, salaries, and time off.
- Does Charlie export include documents and attachments?
- Not in CSV reports. Documents are only included in the full GDPR account export, bundled as files within the downloaded XML archive. There is no API endpoint for bulk document download. If a Charlie document is only an external link to Google Drive, SharePoint, or Dropbox, you must export the actual file from that system separately.
- What format does Charlie export data in?
- CSV for reports, polls, and completed reviews. JSON via the REST API. XML for the full GDPR account export. Date fields in CSVs use DD/MM/YYYY (UK format) — convert to ISO 8601 before importing into a US-based system.
- Does Charlie have an API for data export?
- Yes. Charlie provides a RESTful API with token authentication built from a Client ID and Client Secret. Key endpoints include /team_members, /salaries, /leave_requests, /offices, and /team_member_note_types. Pagination uses page and per_page parameters with a max of 25 on many endpoints. Rate limits are not publicly documented.
- How do I export Charlie data to migrate to another HRIS?
- Start with the full GDPR account export for complete data coverage, then supplement with CSV reports for clean, structured employee and payroll data. Use the API if you need full salary history or repeatable extraction. Map fields to the target system's schema, convert DD/MM/YYYY dates to the target format, and plan for manual document re-upload.


