Accept-Encoding: gzip).
One call exports one sheet. To export a whole workbook, request each template’s
slug in turn.
Authentication
Requires anx-api-key header. See Authentication.
Path & query
The slug of the template whose sheet you want, with a
.csv suffix — e.g.
contacts.csv. List your templates for slugs.Which rows to include:
valid(default) — only fully clean rows. Any row with even one cell that failed validation is excluded entirely, so the count can be lower than the sheet’s total.all— every row, including those with invalid cells.invalid— only the flagged rows (those with at least one invalid cell) — useful for surfacing what needs fixing.
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 how
many records match the filter. When the request advertises gzip, the response is
gzip-encoded (Content-Encoding: gzip).
Errors
| Status | Meaning |
|---|---|
400 | The path doesn’t end in .csv, or filter isn’t one of valid / all / invalid. |
401 | API key missing or invalid. |
404 | No template with that slug, no sheet for it in this migration, or the migration isn’t in your account. |
429 | Rate limit hit — back off and retry. |
500 | Server error. |
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: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 vish@vern.so if you’d use it.
Next
- Poll a run — confirm the execute completed before exporting.
- Errors & limits — shared conventions.