---
title: "Response submitted"
method: POST
path: "response.submitted"
tags: ["Webhooks"]
---

# Response submitted

`POST response.submitted` (webhook)

Fires when a real (non-test) participant completes a project. **Requires Premium tier or above** to subscribe. `session_number` distinguishes repeated completions when `max_completes_per_user > 1`. `user_id` + `platform_id` identify the respondent; call `GET /responses?user_id={user_id}&session_number={session_number}` after receiving this event to retrieve the full answer set for the exact submission.

## Payload

- WebhookPayloadResponseSubmitted: Payload for `response.submitted` events. Fires when a real (non-test) participant completes a project. Premium tier required to subscribe. **Anonymous projects:** when the project's `privacy_mode` is `anonymous`, `user_id`, `platform_id` and `session_number` are `null`. Use `response_id` to fetch the submission; `provider` is still sent.
  - `event` string
  - `community_id` string
  - `project_id` string
  - `response_id` string, nullable: Id of this submission. Pass to GET /communities/{communityId}/projects/{projectId}/responses/{responseId} for the full answer set. Always sent, including on anonymous projects — it is the only join key that survives there.
  - `session_number` integer, nullable: Increments when `max_completes_per_user > 1`; 1 for first session. `null` on anonymous projects (it counts one person's repeat completions).
  - `user_id` string, nullable: Globally-unique Subo user id. Pass to GET /responses?user_id=&session_number= to retrieve the full answer set for this exact submission. `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). Unique only when paired with `provider`. `null` on anonymous projects.
  - `provider` 'discord' | 'web': The account namespace `platform_id` belongs to. Pair the two to identify the account, or use `user_id` for an unambiguous lookup. Sent on anonymous projects too — the source a respondent arrived through is not treated as identifying.
  - `completed_at` string, date-time

## Acknowledgement `200`

Webhook processed successfully

---

[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)
