Export & Import
Move tests and entire projects between QA Studio instances with portable JSON exports. Back up your test definitions, share them with your team, or migrate between environments.
Overview
QA Studio supports exporting and importing test definitions as structured JSON files. You can export a single test or an entire project (including all tests and reusable flows). The export format is self-contained and includes everything needed to recreate the tests in another project or QA Studio instance.
Exports include everything needed to recreate tests — steps, configuration, and flow definitions. Run history, screenshots, videos, and visual regression baselines are not included in exports. These are runtime artifacts tied to specific executions.
Exporting a Single Test
To export a single test, use the test export endpoint:
GET /api/tests/:id/export
This returns a JSON document containing the test's name, description, configuration, and all steps:
{
"version": 1,
"type": "test",
"exportedAt": "2026-02-20T14:30:00.000Z",
"test": {
"name": "Login Flow",
"description": "Verifies user can log in with valid credentials",
"config": {
"browser": "chromium",
"viewport": { "width": 1280, "height": 720 },
"timeout": 30000,
"headless": true,
"useRealChrome": false
},
"steps": [
{ "id": "step_1", "action": "goto", "url": "{{BASE_URL}}/login" },
{ "id": "step_2", "action": "fill", "selector": "#email", "value": "{{USER_EMAIL}}" },
{ "id": "step_3", "action": "fill", "selector": "#password", "value": "{{USER_PASSWORD}}" },
{ "id": "step_4", "action": "click", "selector": "button[type=submit]" },
{ "id": "step_5", "action": "assert", "assertType": "url", "condition": "contains", "value": "/dashboard" }
]
}
}
From the dashboard UI, you can export a test by clicking the export button on the test list. The browser will download the JSON file, which you can then import into any project.
Exporting a Project
To export an entire project with all its tests and reusable flows, use the project export endpoint:
GET /api/projects/:id/export
This returns a comprehensive JSON document containing the project metadata, all tests, and all flows:
{
"version": 1,
"type": "project",
"exportedAt": "2026-02-20T14:30:00.000Z",
"project": {
"name": "My E-Commerce App",
"baseUrl": "https://staging.example.com",
"variables": {
"ADMIN_EMAIL": "admin@example.com",
"API_KEY": "sk_test_abc123"
}
},
"tests": [
{
"name": "Homepage Load",
"description": "Verify homepage loads correctly",
"config": { "browser": "chromium", "viewport": { "width": 1280, "height": 720 }, "timeout": 30000, "headless": true },
"steps": [
{ "id": "step_1", "action": "goto", "url": "{{BASE_URL}}" },
{ "id": "step_2", "action": "assert", "assertType": "title", "condition": "contains", "value": "Welcome" }
]
},
{
"name": "Checkout Flow",
"description": "Complete purchase flow",
"config": { "browser": "chromium", "viewport": { "width": 1280, "height": 720 }, "timeout": 60000, "headless": true },
"steps": [
{ "id": "step_1", "action": "use-flow", "flowName": "Login Steps", "flowId": "flow_abc" },
{ "id": "step_2", "action": "click", "selector": ".add-to-cart" },
{ "id": "step_3", "action": "click", "selector": ".checkout-btn" }
]
}
],
"flows": [
{
"name": "Login Steps",
"description": "Reusable login sequence",
"steps": [
{ "id": "fs_1", "action": "goto", "url": "{{BASE_URL}}/login" },
{ "id": "fs_2", "action": "fill", "selector": "#email", "value": "{{ADMIN_EMAIL}}" },
{ "id": "fs_3", "action": "click", "selector": "button[type=submit]" }
]
}
]
}
JSON Format Specification
Both export types share a common envelope format:
| Field | Type | Description |
|---|---|---|
version |
number | Format version. Currently always 1. |
type |
"test" | "project" |
Indicates whether this is a single test or project export. |
exportedAt |
string (ISO timestamp) | When the export was generated. |
test |
object | Present only in single test exports. Contains name, description, config, and steps. |
project |
object | Present only in project exports. Contains name, baseUrl, and variables. |
tests |
array | Present only in project exports. Array of test objects (name, description, config, steps). |
flows |
array | Present only in project exports. Array of flow objects (name, description, steps). |
Note that exported data does not include internal IDs. Tests and flows are identified by name in the export format, and new IDs are generated during import.
Importing Into a Project
To import tests and flows into an existing project, send the export JSON to the import endpoint:
POST /api/projects/:id/import
Content-Type: application/json
{
"version": 1,
"type": "test",
"test": { ... }
}
The import endpoint accepts both single test exports (type: "test") and project exports (type: "project"). In both cases, new records are created in the target project:
- Each test and flow receives a new unique ID.
- Each step within tests and flows also receives a new unique ID.
- The imported items are added to the target project — existing tests and flows in the project are not modified.
- Test configurations are merged with the default config, so any missing fields receive default values.
The response confirms how many items were imported:
{
"success": true,
"importedTests": 5,
"importedFlows": 2
}
Flow ID Remapping
When importing a project export that contains both tests and flows, QA Studio automatically handles flow reference remapping. This is critical because the exported flow IDs are meaningless in the target project — new IDs must be generated.
The remapping process works as follows:
Flows Are Imported First
All flows from the export are created in the database first. As each flow is created with a new ID, a mapping from flow name to new ID is stored.
Test Steps Are Remapped
When tests are imported, each step is inspected. Any step with action: "use-flow" that has a flowName matching an imported flow will have its flowId updated to the newly generated ID.
References Are Resolved by Name
The remapping uses flow names as the linking mechanism. This is why flow names should be unique within a project — the import process matches use-flow steps to flows by their flowName property.
Use export and import to share tests between projects, create backups of your test definitions before making major changes, or migrate tests between different QA Studio instances (e.g., from development to production). Since run history is not exported, you get a clean set of test definitions without any historical baggage.
Common Use Cases
- Backup — Regularly export your project to keep a JSON backup of all test definitions. Store these files in version control alongside your application code.
- Sharing — Export a test or project and share the JSON file with team members. They can import it into their own QA Studio instance.
- Templating — Create a project with common test patterns (login flows, navigation checks), export it, and import it as a starting point for new projects.
- Migration — When setting up a new QA Studio server, export all projects from the old server and import them into the new one.
- Cross-environment testing — Export tests that use environment variables for URLs and credentials. Import them into projects with different variable values to test staging vs. production.
Limitations
- No run history — Export files do not include run records, screenshots, videos, or visual regression baselines.
- No suite definitions — Test suites are not included in project exports. You will need to recreate suite groupings after import.
- No schedule definitions — Scheduled runs are not exported. Recreate schedules in the target project after import.
- Environment variables in project export — Project exports include the
variablesfield from the project metadata. Be mindful of sensitive values (passwords, API keys) when sharing export files.