Data export
CSV and JSON export formats, date filtering, and jq pipe examples.
This guide covers exporting response data for offline analysis, spreadsheet import, or piping into other tools.
Exporting
CLI:
mf export contact # CSV to stdout
mf export contact --format json # JSON to stdout
mf export contact --output data.csv # Write CSV to file
mf export contact --since 2026-04-01
mf export contact --since 2026-04-01 --until 2026-04-30REST API:
curl "https://app.form.gold/api/forms/contact/responses/export?format=csv" \
-H "Authorization: Bearer YOUR_API_KEY" \
-o responses.csvMCP tool:
export_responses({
slug: "contact",
format: "csv",
since: "2026-04-01",
until: "2026-04-30"
})CSV format
Each row is one response. Columns are in this order:
| Column | Type | Notes |
|---|---|---|
id | string | Response UUID |
submitted_at | string | ISO 8601 UTC timestamp |
ip | string | Submitter IP (if collect.ip: true) |
user_agent | string | Browser user agent (if collect.user_agent: true) |
referrer | string | Referring URL (if collect.referrer: true) |
{field_id} | varies | One column per form field, in definition order |
Example:
id,submitted_at,ip,user_agent,referrer,name,email,message
01JE...,2026-04-28T09:14:00Z,203.0.113.1,Mozilla/5.0,...,https://twitter.com,Jane Smith,jane@example.com,Hello!
01JD...,2026-04-27T18:30:00Z,198.51.100.5,Mozilla/5.0,...,,Alex Chen,alex@example.com,Question about pricingMulti-select fields (checkbox) are serialized as a semicolon-separated list within the cell:
North America;Europe;Asia PacificFile upload fields contain the Supabase Storage URL.
JSON format
An array of response objects:
[
{
"id": "01JE...",
"submitted_at": "2026-04-28T09:14:00Z",
"ip": "203.0.113.1",
"user_agent": "Mozilla/5.0 ...",
"referrer": "https://twitter.com",
"fields": {
"name": "Jane Smith",
"email": "jane@example.com",
"message": "Hello!"
}
}
]jq examples
Extract all email addresses:
mf export contact --format json | jq '[.[].fields.email]'Count responses per campaign type:
mf export campaign-brief --format json | \
jq 'group_by(.fields.campaign_type) | map({ type: .[0].fields.campaign_type, count: length })'Filter to responses this week:
mf export contact --format json --since $(date -v-7d +%Y-%m-%d) | jq lengthExport to CSV and open in Numbers / Excel:
mf export contact --output ~/Desktop/responses.csv && open ~/Desktop/responses.csvExtract all file upload URLs for a field:
mf export campaign-brief --format json | jq '[.[].fields.brief_pdf] | map(select(. != null))'