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) carrying the import/export permission (held by owner/admin/member). Viewers receive 403 forbidden.

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

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

ParameterDefaultNotes
format—Required. 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).
suite—Suite ULID. Required when scope=suite; ignored otherwise. An unresolvable suite ULID returns 404 not_found.
q—Substring filter, applied only when scope=filtered. Same substring-match contract as the test case search endpoint.
cf—Repeatable 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://app.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://app.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://app.probara.net/api/v1/projects/ACME/exports?format=json&scope=filtered&q=login"