Skip to content

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.

Wahab Wahab · · 23 min read
How to Export Data from SolarWinds Service Desk: Methods & Limits
TALK TO AN ENGINEER

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.

Info

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.

  1. Navigate to the module you want to export (e.g., Service Desk → Incidents, Assets → Computers, or Setup → Users).
  2. Apply any filters or saved views to scope the export.
  3. 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.
  4. Click the Actions button (top right of the index page).
  5. Select Export → CSV - Current View (or CSV - All Columns, XML, PDF).
  6. 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)
Warning

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

Warning

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.

  1. Navigate to Setup → Users & Groups → Users.
  2. Locate your admin user and open the detail page.
  3. Click Actions → Generate JSON Web Token.
  4. 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=1

Common 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 1
  • per_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-After header, 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.

Tip

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 description field, find image src URLs, 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:

  1. Record counts match between SWSD UI totals and export file row counts
  2. Custom field values present — compare a sample of 10+ records against the UI
  3. Date/timestamp formats are consistent and timezone-aware
  4. HTML content in descriptions renders correctly or is cleaned
  5. Attachment metadata references resolve to downloadable files (test before S3 URLs expire)
  6. User references (assignee, requester) resolve to valid user IDs
  7. Category/subcategory hierarchies are intact (parent references preserved)
  8. CMDB parent-child CI relationships are preserved (recursive traversal complete)
  9. No orphaned records (comments referencing deleted incidents)
  10. 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_id for 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.

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:

  1. Undocumented rate limit specifics — you cannot accurately scope a timeline without empirical testing on your tenant
  2. No bulk attachment endpoint — forces N+1 API calls per record with attachments
  3. Non-exportable configurations — automation rules, SLA policies, and workflows must be manually documented and rebuilt
  4. 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.

More from our Blog

Help Desk Data Migration Playbook: What Data to Move and What to Leave Behind
Help Desk

Help Desk Data Migration Playbook: What Data to Move and What to Leave Behind

This definitive playbook answers the single most critical question: "What data do we actually need to move?". This strategic guide helps you declutter and decide what's precious and what's junk. We provide a clear breakdown of the non-negotiable Tier 1 data, like tickets , knowledge bases , and user profiles, versus the Tier 2 data that provides rich context, like automations and organizations. Use this as your strategic checklist to avoid common mistakes and ensure a flawless, functional new help desk.

Raaj Raaj · · 7 min read