List responses
Returns a page of responses for one survey, with each answer as a question id and a text value.
HTTP request
GET https://www.asqiro.com/api/v1/surveys/{id}/responses
Any API key in the survey's workspace.
Path parameters
| Parameter | Type | Description |
|---|---|---|
| id | string | The survey id, as returned by the surveys endpoints.Required |
Query parameters
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Number of items per page.Optional · Default: 25 · Maximum: 100 |
| cursor | string | Opaque cursor from a previous response's nextCursor.Optional |
| createdAfter | string | Only return responses created at or after this ISO 8601 timestamp. The bound is inclusive, so a response created exactly at this instant is returned again; deduplicate by id when polling.Optional |
| status | enum | Filter by completion. completed returns finished responses, incomplete returns abandoned ones.Optional · One of: all, completed, incomplete · Default: all |
| format | enum | Set to csv to stream the filtered responses as a CSV file instead of JSON.Optional · One of: csv |
Response body
The response is a page envelope. Each item in data carries an answers array; a question the respondent skipped has no entry.
| Field | Type | Description |
|---|---|---|
| id | string | Unique response id. |
| surveyId | string | Id of the survey this response belongs to. |
| externalUserId | string· nullable | The identifier supplied when creating an embed session, or null for a regular respondent link. |
| completed | boolean | Whether the respondent reached the end of the survey. |
| completedAt | string (ISO 8601)· nullable | When the response was completed, or null if it never was. |
| createdAt | string (ISO 8601) | When the response was started. |
| answers[].fieldId | string· nullable | Id of the question this answer belongs to, or null if the question no longer exists. |
| answers[].type | "textarea" | "email" | "checkbox" | "number" | "calendar" | "country" | "heatmap" | "scale" | "sort"· nullable | Type of the question this answer was given to, or null when that question has since been deleted. |
| answers[].value | string | The answer exactly as stored. Choice and ranking answers hold a JSON array once they carry more than one entry, so read values instead of parsing this. |
| answers[].values | string[] | The answer as a list: one element for an ordinary answer, the selected options for a choice question, and the ranked order for a ranking question. Empty when the question was skipped. |
Note Every answer carries the type of its question, so a value can be read without fetching the survey first, and values holds the parsed form: the selected options for a choice question, the ranked order for a ranking one.
Note createdAfter filters on when a response was started, not on when it was completed. A response started before the timestamp and finished after it is not returned again, so a sync that has to catch late completions should overlap its window instead of advancing it to the newest createdAt it saw.
Note Adding format=csv streams the same filtered set as a CSV download instead of JSON, with a text/csv content type. The CSV is not paginated - cursor and limit do not apply to it. The Export responses as CSV guide describes its columns, values, and quoting.
Errors
- unauthorized · 401 · The API key is missing, malformed, deleted, or its creator lost workspace access. Check the Authorization header, then the key itself.
- forbidden · 403 · The key is valid but lacks the access this call needs - most often a read-only key attempting a write.
- not_found · 404 · No survey with that id is reachable by this key. A survey in another workspace answers the same way as one that does not exist.
- plan_upgrade_required · 403 · The workspace owner's plan does not include API access. Upgrading the plan restores it; retrying will not.
- rate_limited · 429 · Too many requests. The Retry-After response header carries the number of seconds to wait.
- service_unavailable · 503 · The request was valid but could not be completed safely right now. No data was returned or changed, so the same request can be retried.
Example request
bash
curl "https://www.asqiro.com/api/v1/surveys/s_7t2qk8wvbf31/responses?status=completed&createdAfter=2026-08-11T00:00:00.000Z&limit=50" \
-H "Authorization: Bearer $ASQIRO_API_KEY"Returns 200 on success.
json
{
"data": [
{
"id": "r_9fk21bqz4m",
"surveyId": "s_7t2qk8wvbf31",
"externalUserId": null,
"completed": true,
"completedAt": "2026-08-11T15:58:44.019Z",
"createdAt": "2026-08-11T15:56:12.771Z",
"answers": [
{ "fieldId": "f_title", "type": "checkbox", "value": "Weekly", "values": ["Weekly"] },
{
"fieldId": "f_channels",
"type": "checkbox",
"value": "[\"Email\",\"Slack\"]",
"values": ["Email", "Slack"]
},
{
"fieldId": "f_reason",
"type": "textarea",
"value": "It fits our review cycle.",
"values": ["It fits our review cycle."]
}
]
}
],
"nextCursor": null
}