---
title: "Exporting Form Submissions to CSV"
method: GET
path: "/v1/projects/{projectId}/forms/{xmlFormId}/submissions.csv.zip"
tags: ["Submissions"]
---

# Exporting Form Submissions to CSV

`GET /v1/projects/{projectId}/forms/{xmlFormId}/submissions.csv.zip`

To export all the `Submission` data associated with a `Form`, just add `.csv.zip` to the end of the listing URL. The response will be a ZIP file containing one or more CSV files, as well as all multimedia attachments associated with the included Submissions.

You can exclude the media attachments from the ZIP file by specifying `?attachments=false`.

If [Project Managed Encryption](/central-api-encryption) is being used, additional querystring parameters may be provided in the format `{keyId}={passphrase}` for any number of keys (eg `1=secret&4=password`). This will decrypt any records encrypted under those managed keys. Submissions encrypted under self-supplied keys will not be decrypted. **Note**: if you are building a browser-based application, please consider the alternative `POST` endpoint, described in the following section.

If a passphrase is supplied but is incorrect, the entire request will fail. If a passphrase is not supplied but encrypted records exist, only the metadata for those records will be returned, and they will have a `status` of `not decrypted`.

If you are running an unsecured (`HTTP` rather than `HTTPS`) Central server, it is not a good idea to export data this way as your passphrase and the decrypted data will be sent plaintext over the network.

You can use an [OData-style `$filter` query](/central-api-odata-endpoints/#data-document) to filter the submissions that will appear in the ZIP file. This is a bit awkward, since this endpoint has nothing to do with OData, but since we already must recognize the OData syntax, it is less strange overall for now not to invent a whole other one here. Only a subset of the `$filter` features are available; please see the linked section for more information.

## Path parameters

- `projectId` number, required
- `xmlFormId` string, required

## Query parameters

- `attachments` boolean
- `$filter` string
- `groupPaths` boolean
- `deletedFields` boolean
- `splitSelectMultiples` boolean

## Response `200`

OK

## Other responses

- `400` — Bad Request

## Changes

- **2025-12-20** `022694254f0d` — 1 info
  - api operation id `Exporting Form Submissions to CSV` removed and replaced with `exportFormSubmissionsToCsv`
- **2025-10-27** `b11b54eea487` — 2 info
  - added the media type `application/zip` for the response with the status `200`
  - removed the non-success response with the status `403`
- **2025-03-13** `e8c2858fd4eb` — 1 breaking, 2 info
  - removed the media type `application/zip` for the response with the status `200`
  - api operation id `exportFormSubmissionsToCsv` removed and replaced with `Exporting Form Submissions to CSV`
  - added the non-success response with the status `403`

[Change history](https://skmtc.dev/getodk/apis/odk-central-api/changes/v1/projects/:projectId/forms/:xmlFormId/submissions.csv.zip/get.md)

---

[API](https://skmtc.dev/getodk/apis/odk-central-api.md) · [All operations](https://skmtc.dev/getodk/apis/odk-central-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/getodk/odk-central-api/revisions/d4f5ba77f644/schema)
