Skip to main content
Streams one sheet’s data as a CSV, addressed by template slug. This is synchronous — there’s no run to poll. Columns come out in template order, RFC 4180-escaped, and the body is streamed (gzip-compressed when your client sends Accept-Encoding: gzip). One call exports one sheet. To export a whole workbook, request each template’s slug in turn.

Authentication

Requires an x-api-key header. See Authentication.

Path & query

string
required
The slug of the template whose sheet you want, with a .csv suffix — e.g. contacts.csv. List your templates for slugs.
string
Comma-separated column names to return, in the order you give them. Omit to return every column.Names are matched exactly and are case-sensitive — they’re the same names that appear as CSV headers. An unrecognised name returns 400 (unknown_field) listing the valid ones, rather than being ignored: a typo should not quietly leave data out of your export.
boolean
default:"false"
Drop columns that hold no data.A column is dropped only when it’s empty in every row, so the rows you get back all keep the same shape and the header still describes every one of them. Empty means an empty string, null, or an absent value — whitespace counts as data. Combine with fields and the pruning applies within your selection.This is answered from the completed import’s stored per-column coverage, so it reflects the whole sheet, not just some sample. If that coverage isn’t available — an older import, or one where profiling didn’t run — the request returns 409 (coverage_unavailable) rather than quietly handing you every column and letting you believe it was pruned.

Response

200 OK with Content-Type: text/csv; charset=utf-8 and a Content-Disposition attachment header. The body is streamed. An X-Total-Records header reports the sheet’s total row count. When the request advertises gzip, the response is gzip-encoded (Content-Encoding: gzip).

Errors

Example

Into your own storage

The endpoint hands you the file in the HTTP response — Vern doesn’t push it anywhere. To land the clean CSV in your own bucket, pull it from your backend and pipe it straight into object storage. The body streams, so you never have to buffer the whole file:
Any S3-compatible store (R2, MinIO, Spaces) works the same way. Keep your x-api-key server-side — run this from your backend, never the browser. Vern never receives your storage credentials; your backend relays the bytes.
Prefer Vern to deliver directly into a bucket you own — via a presigned URL or stored bucket credentials — instead of relaying it yourself? That’s not available today. Tell us at roupen@vern.so if you’d use it.

Next