---
title: "Get response"
method: GET
path: "/v1/communities/{communityId}/projects/{projectId}/responses/{responseId}"
tags: ["Responses"]
---

# Get response

`GET /v1/communities/{communityId}/projects/{projectId}/responses/{responseId}`

## Request

- Base URL: `https://api.subo.ai`
- URL: `https://api.subo.ai/v1/communities/{communityId}/projects/{projectId}/responses/{responseId}`
- Auth: API key in header `X-API-Key`

Get the complete answer set for one participant response. Works on anonymous projects — the answers are returned, with `user_id`, `platform_id` and `session_number` as `null`. This is the way to follow a `response.submitted` webhook on an anonymous project, using its `response_id`.

## Path parameters

- `communityId` string, required
- `projectId` string, required
- `responseId` string, required

## Response `200`

Response details

- object
  - `data` Response: One participant submission. **On a project whose `privacy_mode` is `anonymous`, `user_id`, `platform_id` and `session_number` are always `null`** — the respondent cannot be identified from the API, matching the XLSX exports and the web Responses tab. `id` still identifies the submission, so a submission's answers stay grouped and fetchable.
    - `id` string
    - `project_id` string
    - `session_number` integer, nullable: The respondent's completion index. Null on anonymous projects — it counts one person's repeat completions.
    - `submitted_at` string, date-time, nullable
    - `user_id` string, nullable: Globally-unique Subo user id. The canonical key for fetching this exact response — GET /responses?user_id=&session_number=. Null on anonymous projects.
    - `platform_id` string, nullable: The respondent's account id within their platform namespace (the Discord snowflake for a Discord-native community). Only unique when paired with the account namespace, so prefer user_id as a join key. Null on anonymous projects.
    - `provider` 'discord' | 'youtube' | 'twitch' | 'steam' | 'patreon' | 'web', nullable: Which connected source admitted the respondent for this session (provenance). Verified respondents carry their platform; Discord-native sessions are 'discord' and open-link web sessions are 'web'. Returned on anonymous projects too — the source is not treated as identifying.
    - `answered_in` 'thread' | 'dm' | 'web', nullable: Where the respondent answered this session: a private Discord thread ('thread'), a Discord DM ('dm'), or the web interview ('web'). A separate axis from `provider`, which is who admitted them — a YouTube-verified respondent can answer on any of the three. **Null means not recorded, not 'thread'**: sessions collected before this field existed carry no surface, so do not treat null as a default when counting. Returned on anonymous projects too.
    - `answers` object[]
      - `block_id` integer
      - `value` string, nullable
      - `option_id` integer, nullable

## Other responses

- `401`: Invalid or missing API key
- `403`: Forbidden
- `404`: Resource not found
- `429`: Rate limit exceeded — wait `retry_after` seconds before retrying. The same value appears in the `Retry-After` header.

---

[API](https://skmtc.dev/subo/apis/subo-api.md) · [All operations](https://skmtc.dev/subo/apis/subo-api/llms.txt) · [OpenAPI document](https://skmtc.dev/subo/apis/subo-api/revisions/12eab2ae4505?raw)
