How to Export Data from SolarWinds Service Desk: Methods & Limits
Export SolarWinds Service Desk data via CSV or API. Covers all ITSM objects, Samanage API rate limits, attachment extraction, and what can't be exported.
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 SolarWinds Service Desk: Methods & Limits
Exporting data from SolarWinds Service Desk (formerly Samanage) means navigating two entirely different systems: a limited UI for CSV dumps, and the Samanage REST API for full-fidelity relational data. If you only need a flat list of recent tickets for a spreadsheet, the native UI works. If you are migrating to a new ITSM platform, running compliance audits, or extracting attachments and CMDB relationships, you must use the API.
This guide covers exactly how to extract your data from SolarWinds Service Desk: which objects export cleanly, the actual rate limits of the Samanage API, which fields silently drop during export, how to handle attachments, comments, and ITIL relationships once the data is out, and what happens when things go wrong mid-extraction.
TL;DR: SolarWinds Service Desk exports most core ITSM objects — incidents, problems, changes, assets, users, and solutions — via CSV from the UI or JSON from the REST API. The API (api.samanage.com) is the only path for full-fidelity bulk export, but it requires an Advanced or Premier plan. Attachments need separate per-record downloads, Task Management v2 has no API support, and automation rules, SLA policies, and service catalog workflows cannot be exported at all. For datasets under 10,000 records, UI exports are sufficient. For anything larger, budget 1–3 weeks of engineering time.
What Data Can You Export from SolarWinds Service Desk?
SolarWinds Service Desk (SWSD), originally built as Samanage before SolarWinds acquired it in 2019, follows a standard ITIL data model. The underlying API still reflects the Samanage architecture — documentation, endpoints, and authentication all use the legacy domain.
Here is the export availability for each core object:
| Object | UI Export | API Export | Format | Known Limitations |
|---|---|---|---|---|
| Incidents | Yes | Yes (/incidents.json) |
CSV, XML, JSON | CSV omits full comment threads and attachments. Use layout=long for complete API payloads. |
| Service Requests | Yes | Yes (/service_requests.json) |
CSV, XML, JSON | Separate API stream from incidents. Same export mechanics. |
| Problems | Yes | Yes (/problems.json) |
CSV, XML, JSON | Linked incident relationships flatten to IDs in CSV. API preserves relational structure. |
| Changes | Yes | Yes (/changes.json) |
CSV, XML, JSON | Approval workflow history partially available via audit_archives param. |
| Releases | Yes | Yes (/releases.json) |
CSV, XML, JSON | Fewer fields than changes. Validate API coverage in a pilot before committing. |
| Configuration Items (CMDB) | Yes | Yes (/configuration_items.json) |
CSV, JSON | CI relationship trees (parent-child) require recursive API calls. Visual CI maps cannot be exported. |
| Hardware (Computers) | Yes | Yes (/hardwares.json) |
CSV, XML, JSON | BIOS/serial data embedded in compound fields. Custom fields export as raw JSON strings in the API. |
| Other Assets | Yes | Yes (/other_assets.json) |
CSV, XML, JSON | Use layout=long for custom fields. |
| Mobile Devices | Yes | Yes | CSV, XML, JSON | IMEI and carrier data included. |
| Software Inventory | Yes | Partial | CSV, XML | Useful for compliance exports. Public API docs are thinner here than for tickets or hardware. |
| Users | Yes | Yes (/users.json) |
CSV, XML, JSON | Role assignments included. Password hashes never exported. |
| Groups | No | Yes (/groups.json) |
JSON | No native CSV export from UI. |
| Departments | No | Yes (/departments.json) |
JSON | API-only in both directions. |
| Sites | No | Yes (/sites.json) |
JSON | API-only in both directions. |
| Solutions (KB Articles) | Yes | Yes (/solutions.json) |
CSV, JSON | X-Total-Count header not returned — pagination requires probing until empty response. Inline images are hosted URLs that break if your instance is deactivated. |
| Categories | No | Yes (/categories.json) |
JSON | Not paginated. Subcategories require a separate param. |
| Contracts | Yes | Yes (/contracts.json) |
CSV, JSON | Contract items and purchases are sub-resources. |
| Purchase Orders | Yes | Yes (/purchase_orders.json) |
CSV, JSON | — |
| Vendors | No | Yes (/vendors.json) |
JSON | Read-only via API. |
| Risks | Yes | Yes (/risks.json) |
CSV, JSON | — |
| Audit Trail | No | Yes (/audits.json) |
JSON | Read-only, tenant-wide change history. Records field-level changes with before/after values, actor, and timestamp. Useful for reconstructing workflow state but does not capture full automation rule definitions. |
| Comments | Partial | Per-parent (/{object}/{id}/comments.json) |
JSON | No bulk comments endpoint. Must walk each parent record individually. |
| Attachments | No | Per-record API calls | Binary files | Must download individually. No bulk download endpoint. Each file capped at 25 MB. (documentation.solarwinds.com) |
| Tasks (v2) | Yes | No | UI only | SolarWinds states Task Management v2 has no API support, and v1 task API calls stop working post-migration. (documentation.solarwinds.com) |
| Automation Rules | No | No | — | Must be manually recreated. |
| SLA Policies | No | No | — | Configuration only; not exportable. |
| Service Catalog Workflows | No | No | — | No export mechanism exists. |
| Saved Views / Filters | No | No | — | UI-only configuration. |
| Notification Rules | No | No | — | Must be rebuilt manually. |
| Dashboard Configurations | No | No | — | Screenshot for reference only. |
The layout parameter on API GET requests is critical. The default short layout omits custom fields, comments, and nested objects. Always use layout=long for export. SolarWinds' February 2024 release notes changed the custom field naming to custom_fields_values and added hourly filtering support, so scripts built against stale field names will break silently — values will simply be absent from responses rather than triggering errors. (documentation.solarwinds.com)
Detecting schema drift: Before running a full export, pull a single record with layout=long and diff the field names against your script's expected schema. If SolarWinds renames or restructures fields (as happened in February 2024), this single-record check catches it before you process 100,000 records with missing data.
Every Way to Get Data Out of SolarWinds Service Desk
There are five practical methods to extract data from SWSD. Each trades off coverage, speed, and complexity differently. There is no direct database access — SWSD is a SaaS product.
| Method | Data Coverage | Volume Limit | Complexity | Best For |
|---|---|---|---|---|
| Native UI Export | Core list-view objects | Immediate download for ≤200 rows; larger sets queued and emailed (documentation.solarwinds.com) | Low | Ad-hoc reports, small datasets |
| Scheduled Report Export | Report-scoped data | Report row limits apply; delivered by email | Low | Recurring snapshots, PM reporting |
| REST API (Samanage API) | All readable objects + attachments | Pagination-based, no ceiling | High | Full migrations, integrations, large-scale export |
| Third-Party ETL | Depends on connector coverage | API-bound | Medium | Teams without backend engineers |
| Managed Migration Service | 100% of extractable data | None | Low for your team | Moving to ServiceNow, Jira SM, Freshservice, or Zendesk |
SolarWinds also offers a weekly scheduled CSV backup of product data, which serves as a baseline safety net. This backup covers primary data objects but is not a full-fidelity snapshot — attachments, audit trails, and configuration data are not included. (solarwinds.com)
Webhook-based extraction: SWSD supports outbound webhooks that fire on record creation and update events. While not a bulk export mechanism, webhooks provide near-real-time data streaming for ongoing sync use cases — for example, feeding ticket data into a data warehouse or BI tool as events occur rather than polling the API on a schedule. Webhooks are configured under Setup → Integrations and deliver JSON payloads to your specified endpoint. This does not replace API-based bulk export but can supplement it for incremental sync after the initial extraction.
Zero-engineering paths are UI export, report export, and the scheduled CSV backup. Developer time starts when you need API pagination, comment walking, attachment downloads, or relationship preservation.
Third-party ETL or BI tools (Pipedream, Portable, etc.) sit on top of these same primitives. They can help with warehousing, but they still inherit SolarWinds' pagination and rate limits and typically don't handle attachments or relationship repair on their own.
Native UI Export: Step-by-Step
The fastest way to get data out without writing code.
- Navigate to the module you want to export (e.g., Service Desk → Incidents, Assets → Computers, or Setup → Users).
- Apply any filters or saved views to scope the export.
- Click the Columns (gear) icon to modify visible columns. This step matters: the CSV export only includes columns currently displayed in your view. Add custom fields, assignee data, and resolution codes before exporting.
- Click the Actions button (top right of the index page).
- Select Export → CSV - Current View (or CSV - All Columns, XML, PDF).
- If the result set is 200 rows or fewer, the file downloads immediately. For larger sets, SWSD queues the export and emails you a download link. (documentation.solarwinds.com)
Depending on the amount of data being exported, it can take a few hours for you to receive an email notification that the export is complete. SolarWinds recommends opening a support ticket if an export takes longer than 24 hours.
What you get: A CSV file containing the columns from your current view.
What you lose:
- Attachments and screenshots are never included.
- Full comment threads are truncated or omitted.
- Relationship references (linked problems, parent CIs) flatten to IDs without context.
- Custom field values may not appear unless included in your view.
- Exported CSV columns differ from import template columns — exported CSVs cannot be used directly for re-import into SWSD. The import template has a fixed schema available under Setup → Import, while export columns reflect your current view configuration. (documentation.solarwinds.com)
Excel character limit trap: Any CSV cell exceeding 32,767 characters causes Excel to display misaligned rows. This commonly affects incident description fields containing HTML or long email threads. Truncate or pre-process these fields before opening in Excel.
Report-based exports offer an alternative path: navigate to Analytics → Reports, configure or select a report, then use the three-dot menu to Schedule report with CSV delivery via email. This is the only way to automate recurring exports without code.
API-Based Export: Authentication, Endpoints, and Rate Limits
The Samanage REST API is the primary method for any serious data export from SolarWinds Service Desk.
Plan Requirements
Plan gate: API access requires the Advanced or Premier plan tier. The Team (Essentials) plan does not include API access. Verify your plan before scoping any API-based export project.
Authentication
The API uses JSON Web Token (JWT) bearer authentication. Only administrators can generate tokens. There is no OAuth flow or service account mechanism — all API access is tied to a specific admin user's token.
- Navigate to Setup → Users & Groups → Users.
- Locate your admin user and open the detail page.
- Click Actions → Generate JSON Web Token.
- Save the token securely — regenerating it invalidates all previous tokens immediately, breaking any scripts or integrations using the old token.
Pass the token in every request header:
curl -H "X-Samanage-Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/vnd.samanage.v2.1+json" \
https://api.samanage.com/incidents.json?per_page=100&page=1Common authentication errors:
| HTTP Code | Cause | Resolution |
|---|---|---|
401 Unauthorized |
Invalid or expired token, or wrong regional endpoint | Regenerate token; verify regional API URL matches your tenant |
403 Forbidden |
Token user lacks permission for the requested resource, or restricted custom field | Verify admin role; check field-level permissions in Setup |
406 Not Acceptable |
Unsupported Accept header version |
Use application/vnd.samanage.v2.1+json |
API Versioning
The current API version is v2.1, specified via the Accept header. SolarWinds does not publish a formal API deprecation policy or timeline for retiring older API versions. If you are building long-lived integrations, pin to v2.1 and monitor SolarWinds release notes for breaking changes — the February 2024 custom field rename is an example of a non-versioned breaking change that affected existing integrations without a version bump.
Regional API Endpoints
SWSD runs on region-specific infrastructure. Your API base URL must match your tenant's region:
| Region | API Base URL | Console URL |
|---|---|---|
| United States | https://api.samanage.com |
app.samanage.com |
| Europe | https://apieu.samanage.com |
appeu.samanage.com |
| Asia-Pacific | https://apiau.samanage.com |
appiau.samanage.com |
Using the wrong regional endpoint returns 401 Unauthorized errors that don't indicate the root cause is a region mismatch. If you're getting unexplained 401s with a valid token, check this first.
Core Export Endpoints
| Object | Endpoint | Notes |
|---|---|---|
| Incidents | GET /incidents.json |
Use layout=long for full fields |
| Service Requests | GET /service_requests.json |
Separate stream from incidents |
| Problems | GET /problems.json |
Supports audit_archives=true |
| Changes | GET /changes.json |
Includes approval data in long layout |
| Releases | GET /releases.json |
— |
| Configuration Items | GET /configuration_items.json |
CMDB records |
| Hardware | GET /hardwares.json |
Computers and servers |
| Other Assets | GET /other_assets.json |
Non-computer assets |
| Users | GET /users.json |
Includes role assignments |
| Groups | GET /groups.json |
— |
| Solutions | GET /solutions.json |
No X-Total-Count header |
| Comments | GET /{object}/{id}/comments.json |
Per-parent sub-resource |
| Categories | GET /categories.json |
Not paginated |
| Contracts | GET /contracts.json |
— |
| Purchase Orders | GET /purchase_orders.json |
— |
| Vendors | GET /vendors.json |
Read-only |
| Audits | GET /audits.json |
Tenant-wide change log |
| Departments | GET /departments.json |
— |
| Sites | GET /sites.json |
— |
Pagination
List endpoints use page-number pagination with two parameters:
page— integer, starts at 1per_page— integer, default 25, maximum 100
The total record count is returned in the X-Total-Count response header for most endpoints. Additional response headers include X-Per-Page, X-Total-Pages, and Link. The solutions endpoint is a known exception — it does not return X-Total-Count, so you must page until you receive an empty array.
All list responses are JSON arrays. Individual record responses are wrapped in object-key wrappers: {"incident": {...}}, {"user": {...}}, etc.
Mid-pagination record changes: If records are created, modified, or deleted while you are paginating through results, you may encounter duplicates (a record shifts to a later page after an insert) or missed records (a record shifts to an earlier page after a deletion). For migration-grade exports, use date-range filters (created_at or updated_at) to lock the window of records you are extracting, then run a second pass for records updated during the extraction.
Rate Limits
The SolarWinds plan comparison page lists up to 150 API calls per user per minute, with specific user-provisioning calls supporting up to 1,500 per user per minute. (solarwinds.com)
However, the API reference itself does not publish precise numeric limits, which makes export planning frustrating. What we know from operational experience:
- Sustained request rates above ~10 requests/second trigger throttling.
- Throttled responses return HTTP 429 Too Many Requests.
- There is no reliably documented
Retry-Afterheader, though some tenants return one intermittently. - Conservative safe throughput: 1 request every 1–2 seconds.
- Rate limit scope: Limits appear to be per-token (per-user), not per-tenant. Multiple admin tokens may allow parallel extraction streams, but this is not officially documented and risks triggering tenant-level blocks.
- Concurrent requests: Running multiple threads with the same token counts all requests against the same rate bucket. Two threads at 5 req/sec = 10 req/sec against the same limit.
Older mirrored API docs quote legacy higher limits (1,000–1,500 calls per minute depending on plan). For current planning, use 150/minute unless SolarWinds support confirms a higher limit for your specific tenant.
Build your export scripts with exponential backoff starting at 2 seconds. Log every 429 response with a timestamp so you can empirically determine your tenant's actual threshold before committing to a full extraction timeline.
Throughput math: At 100 records per page with 1 request per second, raw pagination for a 50,000-incident dataset takes about 8.3 minutes (500 pages). But if you need comments and attachments per incident (separate API calls each), a 50,000-incident export with full sub-resources can take 15–30+ hours at safe request rates. With an average of 3 comments and 1.5 attachments per incident, that's 50,000 + 50,000 (comment fetches) + 75,000 (attachment downloads) = 175,000 API calls, or roughly 48 hours at 1 req/sec.
Extraction Script (Python)
Here is a production-safe pattern for paginated extraction with retry logic:
import requests
import time
import json
import random
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
BASE_URL = "https://api.samanage.com"
TOKEN = "YOUR_JWT_TOKEN"
HEADERS = {
"X-Samanage-Authorization": f"Bearer {TOKEN}",
"Accept": "application/vnd.samanage.v2.1+json"
}
MAX_RETRIES = 5
def export_all(endpoint, output_file, extra_params=None):
page = 1
per_page = 100
all_records = []
consecutive_errors = 0
while True:
params = {"page": page, "per_page": per_page, "layout": "long"}
if extra_params:
params.update(extra_params)
url = f"{BASE_URL}/{endpoint}"
try:
response = requests.get(url, headers=HEADERS, params=params, timeout=60)
except requests.exceptions.RequestException as e:
logging.error(f"Network error on page {page}: {e}")
consecutive_errors += 1
if consecutive_errors >= MAX_RETRIES:
logging.error(f"Max retries reached at page {page}. Saving partial results.")
break
time.sleep(min(60, 2 ** consecutive_errors) + random.random())
continue
if response.status_code == 401:
logging.error("Authentication failed (401). Check token and regional endpoint.")
break
if response.status_code == 403:
logging.error(f"Permission denied (403) on {endpoint}. Check user role permissions.")
break
if response.status_code == 404:
logging.warning(f"Endpoint not found (404): {endpoint}. Skipping.")
break
if response.status_code in (429, 500, 502, 503, 504):
consecutive_errors += 1
if consecutive_errors >= MAX_RETRIES:
logging.error(f"Max retries ({MAX_RETRIES}) reached at page {page}. Saving partial results.")
break
retry_after = int(response.headers.get("Retry-After", 0) or 0)
wait = retry_after or min(60, 2 ** consecutive_errors) + random.random()
logging.warning(f"Retryable error {response.status_code} on page {page}. "
f"Waiting {wait:.1f}s (attempt {consecutive_errors}/{MAX_RETRIES})...")
time.sleep(wait)
continue
response.raise_for_status()
consecutive_errors = 0 # reset on success
data = response.json()
if not data: # empty array = last page
break
all_records.extend(data)
total_count = response.headers.get("X-Total-Count", "unknown")
logging.info(f"Page {page}: {len(data)} records (cumulative: {len(all_records)}, "
f"total available: {total_count})")
page += 1
time.sleep(1) # stay under rate limits
with open(output_file, "w") as f:
json.dump(all_records, f, indent=2)
return len(all_records)
# Export incidents with full detail
total = export_all("incidents.json", "swsd_incidents.json")
logging.info(f"Exported {total} incidents")
# Export with date-range filter to avoid mid-pagination drift
total = export_all(
"incidents.json",
"swsd_incidents_2024.json",
extra_params={"created_at[]": "2024-01-01", "created_at[]": "2024-12-31"}
)Error codes you will encounter during extraction:
| HTTP Code | Meaning | Script Behavior |
|---|---|---|
200 |
Success | Process data, advance page |
401 |
Invalid token or wrong region | Stop immediately, fix auth |
403 |
Insufficient permissions | Log and skip object |
404 |
Endpoint doesn't exist (e.g., deleted record mid-pagination) | Log and continue |
429 |
Rate limited | Exponential backoff, retry |
500/502/503/504 |
Server error | Exponential backoff, retry with max attempts |
Exporting Attachments and Inline Media
Attachments do not come out in CSV exports or standard API list responses. They require a separate extraction stream entirely.
When you query an incident with layout=long, the JSON payload includes an attachments array. Each attachment object contains metadata (filename, size, content type) and a URL. These URLs are pre-signed AWS S3 links pointing to files stored in SolarWinds' S3 infrastructure.
Critical constraints:
- URLs expire. Pre-signed S3 URLs have a limited validity window (typically minutes to hours, not days). Your extraction script must parse the JSON and immediately download each file. You cannot export the JSON, wait a week, then download the files.
- No bulk download endpoint. Each attachment is a separate HTTP GET request.
- File size limit: Individual uploads are capped at 25 MB, and attachment settings also apply to API calls. (documentation.solarwinds.com)
- Inline images pasted into incident descriptions or KB articles are stored as hosted assets referenced via internal URLs. You must parse the HTML body of the
descriptionfield, find imagesrcURLs, download those files, and rewrite the HTML to point to your destination platform. These URLs will break if your SolarWinds instance is deactivated. - Comments carry attachments too. You must iterate through every incident and every comment on each incident to discover all files.
- Attachment downloads count against your rate limit. Each file download is an API call. 10,000 incidents × 1.5 attachments per incident = 15,000 additional API calls, or roughly 4 hours at 1 req/sec.
If your migration requires attachments, add 30–50% to your time estimate for attachment extraction alone.
What Data Cannot Be Exported from SolarWinds Service Desk?
No platform allows 100% data portability. The following data categories have no export path — not through the UI, not through the API:
| Data Type | Exportable? | Workaround |
|---|---|---|
| Automation rules / triggers | No | Document manually from UI; the audit trail (/audits.json) shows when rules fired but not rule definitions |
| SLA policies | No | Recreate in target platform; document thresholds and escalation tiers manually |
| Service catalog workflows | No | No workaround; must be rebuilt from scratch |
| Notification rules | No | Document and recreate; copy email templates from Setup before deactivation |
| Saved views / filters | No | No workaround |
| Dashboard configurations | No | Screenshot for reference |
| Integration configurations | No | Document API keys, webhook URLs, connected apps |
| Email notification templates | No | Copy manually from Setup |
| Task Management v2 | No API | UI-only export; v1 API calls stop working post-migration (documentation.solarwinds.com) |
| Custom permission sets | Partial | Role names exportable via API; custom permission assignments must be manually verified |
| Deleted records | Partial | The audit_archives parameter on some endpoints (e.g., /incidents.json?audit_archives=true) returns metadata about deleted records — including the actor, timestamp, and last-known field values — but not the full record payload or its attachments |
The audit trail endpoint (/audits.json) provides read-only access to tenant-wide change history with field-level before/after values, which partially compensates for the inability to export workflow configurations — you can see what was changed, by whom, and when, which helps reconstruct business logic during migration.
What your team retains post-migration: Ticket content, user records, asset inventories, CMDB relationships, and KB articles are all fully exportable. What you lose are the operational configurations — the rules, automations, and workflows that define how your service desk behaves. These must be rebuilt in any target platform.
Data Format, Encoding, and Cleanup After Export
SWSD CSV exports use UTF-8 encoding. API responses are standard UTF-8 JSON. Before importing into a target system, handle these common issues:
HTML in text fields: Incident descriptions are stored as rich HTML, often from email-to-ticket conversion. If your destination only supports Markdown or plain text, you must convert during the ETL phase. Importing raw HTML into a plain-text field makes tickets unreadable. Common libraries: Python's html2text for Markdown conversion, BeautifulSoup for plain text extraction.
Date formats: The API returns ISO 8601 timestamps (e.g., 2025-03-15T14:30:00.000-05:00). CSV exports may use locale-specific date formats depending on tenant configuration. Ensure your destination expects UTC or apply timezone offsets during transformation to avoid shifting all your ticket creation dates.
Multi-value custom fields: Exported as comma-separated strings within a single CSV cell, which breaks if any value itself contains commas. In JSON with layout=long, these export as proper arrays.
ID mapping: SolarWinds assigns unique integer IDs to every object. An incident payload lists "requester": {"id": 12345}. You must build a mapping table of SolarWinds IDs to destination IDs so you can re-link requesters, assignees, and CIs during import.
Nested object references: In JSON with layout=long, related objects are fully embedded (an incident's assignee includes the complete user object). In CSV, these flatten to name or email strings, losing the relational ID. Keep raw JSON as your source-of-record extract; treat CSV as an operator-friendly view, not the master archive.
Field naming mismatches: Analytics exports may label fields differently from the UI (e.g., "To Closure" vs. "Service Time to Closure"). The API uses snake_case (created_at) while CSV headers use display names ("Created At"). Validate terminology before mapping to your target schema.
Asset source conflicts: If multiple discovery sources feed the same asset, exported records may contain conflicting values. SolarWinds prioritizes data from different sources internally, but the exported record may not reflect the resolution you expect. (documentation.solarwinds.com)
Re-import constraints: SWSD's CSV import function (Setup → Import) accepts a fixed template schema, not the format produced by CSV export. If you need to round-trip data (export, modify, re-import), you must transform the exported CSV to match the import template. The import template supports incidents, users, hardware, and other assets, but not all object types.
Post-export validation checklist:
- Record counts match between SWSD UI totals and export file row counts
- Custom field values present — compare a sample of 10+ records against the UI
- Date/timestamp formats are consistent and timezone-aware
- HTML content in descriptions renders correctly or is cleaned
- Attachment metadata references resolve to downloadable files (test before S3 URLs expire)
- User references (assignee, requester) resolve to valid user IDs
- Category/subcategory hierarchies are intact (parent references preserved)
- CMDB parent-child CI relationships are preserved (recursive traversal complete)
- No orphaned records (comments referencing deleted incidents)
- Character encoding verified — no mojibake in international text
Export for Migration vs. Backup vs. Compliance
These three use cases look similar but have different requirements.
Migration Export
Data must be transformed and loaded in dependency order: users and groups first, then CIs and assets, then incidents, problems, and changes (which reference users and CIs). Loading out of order breaks foreign key relationships.
Key requirements:
- ID mapping tables: SWSD internal IDs won't match target platform IDs. Build a table linking
swsd_id → target_idfor every migrated record. Store these mappings persistently — you will need them for post-migration validation and any follow-up corrections. - Relationship preservation: Incident→Problem links, CI→Incident associations, and user→group memberships must be rebuilt in the target using mapped IDs.
- Comment and attachment reassociation: Comments must load as children of their parent incidents, preserving timestamps and author attribution.
- Schema transformation: If you are migrating to a platform with a fundamentally different data model — for example, from a complex ITSM model to a flat chat model for a SolarWinds to LiveChat migration — you'll drop entire object types like CMDB. If migrating to ServiceNow, you must map SolarWinds CIs to ServiceNow's specific CMDB classes (e.g.,
cmdb_ci_server,cmdb_ci_computer).
For a detailed migration walkthrough, see our SolarWinds Service Desk to ServiceNow guide.
Backup Export
You don't need to transform the data, but you must capture the full JSON payload and download all attachments. The pre-signed S3 URLs will expire if your SolarWinds contract lapses.
SolarWinds offers a weekly scheduled CSV backup of product data, but it is not a full-fidelity snapshot — attachments, configurations, and audit trails are excluded. For a true backup, run the API export on a regular schedule and store outputs in versioned, timestamped directories. Version your export scripts alongside the data so you can detect schema drift between runs.
Compliance and Legal Export
GDPR Article 20 (data portability): SWSD provides data in CSV and JSON formats, satisfying the "structured, commonly used and machine-readable format" requirement. SolarWinds confirms customers can request full copies of product data including audit trails in CSV format.
DSAR (Data Subject Access Requests): Use API filters to extract all records associated with a specific user email — incidents they requested, comments they posted, audit entries. The API supports filtering by requester email on most endpoints (e.g., /incidents.json?requester []=email@example.com).
SolarWinds Service Desk is hosted on AWS infrastructure in the US, EU, and Australia with SOC 1/SOC 2 audit reports, PCI DSS Level 1 certification, and ISO 27001 compliance through AWS. HIPAA BAAs are available for healthcare customers.
Contractual note: SolarWinds' Data Processing Addendum states that SolarWinds shall delete or return personal data after termination or after processing services end, unless law requires retention. Do not wait until the last week of a contract to test your export path — run a complete test extraction at least 30 days before contract end to identify and resolve access issues. (solarwinds.com)
How Portable Is SolarWinds Service Desk Data?
Portability rating: Mostly Portable — with significant caveats.
- ~80% of your data (incidents, problems, changes, assets, users, KB articles, CMDB, contracts) exports cleanly via the API in structured JSON.
- ~10% requires extra engineering (attachments need per-record downloads; comments need per-incident API calls; CMDB relationship trees need recursive traversal; inline images need URL rewriting).
- ~10% is not exportable (automation rules, SLA policies, service catalog workflows, notification configurations, dashboard layouts, Task Management v2).
The non-exportable 10% represents your operational configuration — the business logic layer. For organizations with complex multi-tier approval workflows, custom service catalog items, and extensive automation rules, rebuilding this layer in a new platform typically takes 2–4 weeks of dedicated configuration work regardless of how fast the data itself moves.
There are no contractual restrictions on exporting your own data. SolarWinds does not lock you in via Terms of Service. The lock-in is practical:
- Undocumented rate limit specifics — you cannot accurately scope a timeline without empirical testing on your tenant
- No bulk attachment endpoint — forces N+1 API calls per record with attachments
- Non-exportable configurations — automation rules, SLA policies, and workflows must be manually documented and rebuilt
- S3 URL expiry — forces real-time download during extraction, preventing deferred processing
The real switching cost isn't getting the data out — it's transforming the data to fit a new ITSM schema and rebuilding the ITIL relationships between Incidents, Problems, Changes, and Assets.
The undocumented rate limits are the biggest practical barrier. Without reliably published limits, you cannot accurately scope an export project timeline without running empirical tests against your own tenant first. This alone can add 2–3 days to any migration planning phase.
Timeline and Resourcing for a Full Data Export
Realistic time estimates based on dataset size:
| Dataset Size | Records | Method | Time Estimate | Team |
|---|---|---|---|---|
| Small | < 10,000 | UI CSV + basic API | 1–2 days including validation | 1 admin, no developer needed |
| Medium | 10,000–100,000 | REST API | 1–2 weeks | 1 developer + 1 PM |
| Large | 100,000+ with attachments/CMDB | REST API + parallel streams | 2–4 weeks | 1–2 developers + 1 PM |
Phase breakdown for a medium-sized export (10K–100K records):
| Phase | Duration | Activities |
|---|---|---|
| Scoping | 1–2 days | Inventory objects, count records per object type, identify custom fields, verify API access and plan tier, run single-record schema check |
| API setup | 1 day | Generate token, test connectivity, confirm regional endpoint, test pagination, empirically measure rate limit threshold |
| Script development | 2–3 days | Build extraction scripts with pagination, error handling, rate limit backoff, attachment download pipeline |
| Extraction | 1–3 days | Run full export, download attachments, extract sub-resources (comments, CIs), handle mid-pagination drift |
| Validation | 1–2 days | Record count verification, sample comparison (10+ records per object type), relationship integrity checks |
| Cleanup | 1–2 days | Format conversion, HTML stripping/conversion, date normalization, deduplication, ID mapping table construction |
The most common underestimate is attachment extraction time. If you have 50,000 incidents with an average of 2 attachments each, that's 100,000 separate file downloads at rate-limited speeds — roughly 28 hours at 1 request/second. Budget accordingly.
When this shifts from export to migration, the technical work concentrates in comments, attachments, custom fields, and relationship ordering — not in the first GET call. Split extraction, validation, and load into separate checkpoints instead of hoping a single dump is enough.
When to Bring In Help
For teams with fewer than 10,000 records and no attachment requirements, self-serve CSV exports work fine. For anything larger — especially migrations where data integrity, relationship preservation, and attachment fidelity matter — the combination of undocumented rate limits, per-record sub-resource extraction, and format transformation adds up fast.
ClonePartner has completed 1,500+ data migrations across ITSM platforms, including SolarWinds Service Desk extractions with full CMDB relationship trees, comment history, and attachments at scale. If you're evaluating portability or planning a move, a 30-minute scoping call can save weeks of trial-and-error against undocumented API constraints.
Frequently Asked Questions
- Can I export all my data from SolarWinds Service Desk?
- You can export roughly 80% of your data through the REST API and UI CSV exports. Core objects like incidents, problems, changes, assets, users, and knowledge base articles are fully exportable. Attachments require separate per-record API calls. Automation rules, SLA policies, service catalog workflows, and Task Management v2 data cannot be exported through any method and must be manually recreated.
- Does SolarWinds Service Desk export include attachments?
- No. Neither CSV exports nor standard API list responses include attachment binary data. Attachments must be downloaded individually per incident or comment via separate API calls using pre-signed URLs in the response. There is no bulk attachment download endpoint, and each file is capped at 25 MB.
- What SolarWinds Service Desk plan do I need for API access?
- API access requires the Advanced or Premier plan tier. The Team (Essentials) plan does not include API access. Only administrators can generate the JSON Web Token needed for authentication. Verify your plan before committing to an API-based export strategy.
- How long does it take to export data from SolarWinds Service Desk?
- For small datasets under 10,000 records, UI CSV exports take minutes to hours. Medium datasets (10K–100K records) using the API take 1–2 weeks including script development, extraction, and validation. Large datasets over 100K records with attachments can take 2–4 weeks due to rate limits and per-record sub-resource fetches.
- What data cannot be exported from SolarWinds Service Desk?
- You cannot export automation rules, SLA policies, service catalog workflows, notification rules, saved views, dashboard configurations, or Task Management v2 data. These must be documented manually and rebuilt in your target platform. The audit trail endpoint provides partial change history as a partial workaround.

