# Exports endpoints

> CSV export of a workflow's runs. Every operation with parameters, body, responses, errors and examples.

Source: https://developers.processcart.com/reference/exports

CSV export of a workflow's runs.

Base URL `https://app.processcart.com/api/v1`. Every operation below is also in the [OpenAPI document](https://developers.processcart.com/openapi.json) and the [interactive reference](https://developers.processcart.com/reference).

| Operation | Method and path | Scope |
| --- | --- | --- |
| [Export a workflow's runs as CSV](#exportRunsCsv) | <code class="pc-docs-wrap">GET /v1<wbr>/exports<wbr>/runs.csv</code> | Scope `runs:read` |

## GET /v1/exports/runs.csv
**Export a workflow's runs as CSV.** Scope `runs:read` · checked against the key's workflow / folder allowlist (403 `not_allowed_for_key` outside it). Operation id `exportRunsCsv` · [open in the API reference](https://developers.processcart.com/reference#tag/exports/GET/v1/exports/runs.csv).

One workflow's runs as a CSV file, newest first, with the same filters as `GET /v1/runs` and the Reports grid's column choice: `cols` picks the run columns, `fields` the field columns (values formatted as the app shows them — currency with its symbol, dates in the workspace's time zone, members by name). UTF-8 with a BOM and CRLF line ends, so it opens cleanly in Excel. The whole file is built before it is sent; a selection above 10,000 rows is refused with a 422 — narrow the filter.

**Query parameters** (an unknown parameter is a 422 `validation_failed` with `errors[].code = "unknown_parameter"`)

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `workflowId` | string (uuid) | yes |  |
| `status` | `"active"` \\| `"completed"` \\| `"on_hold"` \\| `"archived"`[] | no | Comma-separated (or repeat the parameter). |
| `priority` | `"none"` \\| `"low"` \\| `"medium"` \\| `"high"` \\| `"urgent"`[] | no | Comma-separated (or repeat the parameter). |
| `labels` | string[] | no | Comma-separated (or repeat the parameter). |
| `assignee` | string | no |  |
| `due` | `"overdue"` \\| `"today"` \\| `"week"` \\| `"none"` | no |  |
| `q` | string | no |  |
| `qMode` | `"prefix"` \\| `"contains"` | no |  |
| `updatedSince` | string (date-time) | no | Incremental sync: only items whose `updatedAt` is at or after this instant (inclusive), ordered by `updatedAt` ascending; an explicit conflicting `sort` / `order` is a 422. Overlap by a minute and dedupe: a Run by `(id, revision)`, any other item (workflow, view, webhook, schedule, automation rule) by `(id, updatedAt)` — a higher `revision` or a later `updatedAt` replaces the copy you hold, an equal one is unchanged. |
| `includeTrashed` | boolean | no |  |
| `cols` | `"status"` \\| `"priority"` \\| `"labels"` \\| `"progress"` \\| `"key_date"` \\| `"due"` \\| `"started"` \\| `"completed"`[] | no | Comma-separated (or repeat the parameter). |
| `fields` | string[] | no | Comma-separated (or repeat the parameter). |

**Responses**

| Status | Meaning | Body |
| --- | --- | --- |
| 200 | OK. | `text/csv; charset=utf-8` |
| 401 | No usable credential. `unauthorized` — Authentication required; `invalid_api_key` — Invalid API key; `key_revoked` — API key revoked. | [Problem](https://developers.processcart.com/errors) |
| 403 | `insufficient_scope` — Insufficient scope; `not_allowed_for_key` — Not allowed for this key. | [Problem](https://developers.processcart.com/errors) |
| 404 | `not_found` — Not found. | [Problem](https://developers.processcart.com/errors) |
| 405 | The verb is not supported on this path. `method_not_allowed` — Method not allowed. | [Problem](https://developers.processcart.com/errors) |
| 409 | `workflow_not_published` — Workflow not published. | [Problem](https://developers.processcart.com/errors) |
| 422 | `validation_failed` — Validation failed. | [Problem](https://developers.processcart.com/errors) |
| 429 | `rate_limited` — Too many requests. | [Problem](https://developers.processcart.com/errors) |
| 500 | `internal_error` — Internal error. | [Problem](https://developers.processcart.com/errors) |
| 503 | `unavailable` — Service unavailable. | [Problem](https://developers.processcart.com/errors) |

**Errors** (every code this operation can answer; see [Errors](https://developers.processcart.com/errors))

- 401 [`invalid_api_key`](https://developers.processcart.com/errors#invalid_api_key) — Invalid API key
- 401 [`key_revoked`](https://developers.processcart.com/errors#key_revoked) — API key revoked
- 401 [`unauthorized`](https://developers.processcart.com/errors#unauthorized) — Authentication required
- 403 [`insufficient_scope`](https://developers.processcart.com/errors#insufficient_scope) — Insufficient scope
- 403 [`not_allowed_for_key`](https://developers.processcart.com/errors#not_allowed_for_key) — Not allowed for this key
- 404 [`not_found`](https://developers.processcart.com/errors#not_found) — Not found
- 405 [`method_not_allowed`](https://developers.processcart.com/errors#method_not_allowed) — Method not allowed
- 409 [`workflow_not_published`](https://developers.processcart.com/errors#workflow_not_published) — Workflow not published
- 422 [`validation_failed`](https://developers.processcart.com/errors#validation_failed) — Validation failed
- 429 [`rate_limited`](https://developers.processcart.com/errors#rate_limited) — Too many requests
- 500 [`internal_error`](https://developers.processcart.com/errors#internal_error) — Internal error
- 503 [`unavailable`](https://developers.processcart.com/errors#unavailable) — Service unavailable

**Example response** (200)

```json
"﻿Run name,Status,Started,Completed,Customer,Order code,Memo,Quantity,Amount,Fee\r\nCSV run two,Active,\"Oct 10, 2026\",,Ann,,,,\"$2,500.50\",\r\nCSV run one,Active,\"Oct 10, 2026\",,Ann,,,,\"$1,700.00\",\r\n"
```
