Response data format
One row per response, one column per question id, contact details in a separate file. Simple enough to open in a spreadsheet, strict enough to pool.
The answers file
A UTF-8 CSV with a header row. Columns, in order:
| Column | Meaning | Example |
|---|---|---|
response_id | Random identifier for the response. Not a person. | k3Yx… |
instrument | Instrument id. | community-needs |
instrument_version | Version of the instrument the respondent saw. | 1.0.0 |
channel_code | The coded link the response came through. | kauai-flyer |
state | Two-letter state or territory code of the hosted page. | HI |
county_fips | Five-digit county FIPS from the county question, outside, or empty. | 15007 |
status | complete if the respondent pressed submit, else partial. | complete |
last_step | The last step saved, for partial responses. | needs |
consented_at, updated_at, submitted_at | UTC timestamps, ISO 8601. Submitted is empty for partial responses. | 2026-11-03T18:21:07Z |
Then one column per question id in instrument order, followed by one column per write-in id. Rules:
- Radio and scale answers hold one value token.
- Checkbox answers hold value tokens joined with
|in instrument order, or empty. - Free text is quoted CSV text with newlines preserved.
- Empty means not answered. There is no distinction between skipped and never reached except through
statusandlast_step. - Contact fields never appear in this file.
The follow-up requests file
A separate CSV with response_id, name, email, phone, created_at, holding only the respondents who chose to give contact details. It joins to the answers file on response_id, and that join is a deliberate act by the organization that owns the data, never something the system does for you.
JSON
The same data as an array of objects, with checkbox answers as arrays rather than bar-joined strings, and the instrument definition's id and version at the top:
{
"instrument": "community-needs",
"instrument_version": "1.0.0",
"exported_at": "2026-11-30T02:00:00Z",
"responses": [
{
"response_id": "k3Yx…",
"channel_code": "kauai-flyer",
"state": "HI",
"county_fips": "15007",
"status": "complete",
"answers": {
"cn_role": "self",
"cn_unmet": ["housing", "transportation"],
"cn_unmet_housing_more": "Nothing on the waitlist is accessible.",
"cn_difficulty": "hard"
}
}
]
}
Pooling rule
Two files pool when they share a question id and the instrument versions do not differ in that question's values. Labels may differ, including by language. A translated instrument whose values were kept intact pools; one whose translator rewrote the values does not, which is why the plain-text master prints the value tokens beside every option.
Versioning
Instrument versions follow major.minor.patch. A patch changes wording only. A minor adds questions or options. A major removes or re-orders anything, and a major change is the only one that can stop two files pooling on a question that both contain.