Skip to content

Test Case Export API

The export endpoint downloads a project’s active (non-archived) test cases as a single artifact. It supports four formats and three scope options, so an integrator can pull an entire project, one suite subtree, or the exact filtered slice a user is looking at in the repository view.

The endpoint is read-only — it emits no audit events and makes no state changes. Attachments (step images, defect evidence, etc.) are never included in any exported format; only text, tags, custom field values, and suite structure travel with the artifact.

All requests require an authenticated request (Bearer API token or session cookie) with at least member role in the project’s organization. Viewers receive 403 forbidden.

GET/api/v1/projects/{projectId}/exports

{projectId} is the project code (for example ACME).

ParameterDefaultNotes
formatRequired. One of json, xml, csv, xlsx. An unlisted value returns 422 validation_failed.
scopeprojectproject (the whole project), suite (the suite given by suite, plus all of its descendant suites), or filtered (the server re-evaluates q/cf — see below).
suiteSuite ULID. Required when scope=suite; ignored otherwise. An unresolvable suite ULID returns 404 not_found.
qSubstring filter, applied only when scope=filtered. Same substring-match contract as the test case search endpoint.
cfRepeatable custom-field filter, applied only when scope=filtered. Each entry is <fieldUlid>:<value[,value…]> — identical contract to the search/list endpoints.

200 with the artifact body in the requested format. The response always carries a matching Content-Type and a Content-Disposition: attachment header naming the file <projectId>-export.<extension>:

formatContent-TypeExtension
jsonapplication/json.json
xmlapplication/xml.xml
csvtext/csv.csv
xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xlsx

Every format carries the same underlying data: for each active test case, its title, description, tags, suite path, steps, and full custom field values (fixed fields — priority/type/status — plus every custom field configured on the project). CSV and XLSX cells that begin with =, +, -, @, a tab, or a carriage return are prefixed with a leading ' to neutralize spreadsheet formula injection — this is visible if you open the file in a spreadsheet application.

An export is bounded to EXPORT_MAX_CASES (5000) active cases per request. When the resolved scope would exceed this ceiling, the request fails before any row is read or serialized:

{ "error": { "code": "too_many_cases", "message": "..." } }

Narrow the scope (a smaller suite, or a filtered scope with q/cf) and retry.

Export requests are rate-limited per organization. Exceeding the limit returns 429 with { "error": { "code": "too_many_requests", ... } }. Back off and retry after a short delay.

StatusCodeCondition
403forbiddenThe caller’s role is viewer
404not_foundprojectId does not exist in the active organization, or scope=suite references a suite ULID that does not exist in this project
422validation_failedformat is missing or not one of the four listed values, or scope=suite is set without suite
422too_many_casesThe resolved scope exceeds EXPORT_MAX_CASES
429too_many_requestsThe organization’s export rate limit was exceeded

Every file this endpoint produces — JSON, XML, CSV, or XLSX — round-trips back in through the two-step import API: POST /api/v1/projects/{projectId}/imports:stage to stage the file, then POST /api/v1/projects/{projectId}/imports/commit with the matching probara_json/probara_xml/probara_csv/probara_xlsx source format — a full round trip for backing up and restoring, or migrating cases between projects. Because attachments are never exported, a re-imported case never carries its original step images; everything else (title, description, tags, suite path, steps, and custom field values) round-trips.

Export a whole project as CSV:

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-o acme-export.csv \
"https://probara.net/api/v1/projects/ACME/exports?format=csv"

Export one suite subtree (including its descendants) as XLSX:

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-o acme-suite-export.xlsx \
"https://probara.net/api/v1/projects/ACME/exports?format=xlsx&scope=suite&suite=01JAAAA..."

Export the filtered slice matching a search query as JSON:

Terminal window
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-o acme-filtered-export.json \
"https://probara.net/api/v1/projects/ACME/exports?format=json&scope=filtered&q=login"