> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usertick.com/llms.txt
> Use this file to discover all available pages before exploring further.

# The Response resource

> The single shape a response takes outside Usertick, in API reads, in the data of webhook deliveries and in the Zapier app.

Every response that leaves Usertick has the same shape. The REST API returns it, every webhook delivery that carries a response has it in `data`, and the Zapier app outputs it, so code that handles one source handles all of them.

```json theme={null}
{
  "id": "9b1c2d3e-4f50-4a61-8b72-93a4b5c6d7e8",
  "url": "https://app.usertick.com/inbox/9b1c2d3e-4f50-4a61-8b72-93a4b5c6d7e8",
  "survey": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "Checkout feedback" },
  "site": { "id": "22222222-2222-4222-8222-222222222222", "domain": "shop.example.com" },
  "createdAt": "2026-09-30T10:00:00.123Z",
  "updatedAt": "2026-09-30T12:31:05.120Z",
  "source": "widget",
  "language": "en",
  "country": "US",
  "pageUrl": "https://shop.example.com/checkout",
  "device": { "type": "desktop", "browser": "Chrome", "os": "macOS" },
  "variant": null,
  "variantName": null,
  "contact": { "id": "33333333-3333-4333-8333-333333333333", "email": "maya@example.com" },
  "respondent": {
    "userId": "user_8271",
    "anonymousId": "5f0c7a2b-8d4e-4c1a-9e3f-2b6d8a0c4e1f",
    "verified": true,
    "email": "maya@example.com",
    "emailSource": "identify",
    "name": "Maya Chen",
    "company": "Example Inc.",
    "traits": { "company": "Example Inc.", "plan": "pro" },
    "traitsVerified": false,
    "contactQuestion": null,
    "contact": { "id": "33333333-3333-4333-8333-333333333333" }
  },
  "answers": [
    {
      "questionId": "4b1c2d3e-0000-4a5b-8c9d-0e1f2a3b4c5d",
      "question": "How likely are you to recommend us?",
      "type": "nps",
      "value": 4,
      "text": "4"
    },
    {
      "questionId": "9e8d7c6b-0000-4a5b-8c9d-0e1f2a3b4c5d",
      "question": "What went wrong?",
      "type": "text",
      "value": "Checkout rejects my card every time",
      "text": "Checkout rejects my card every time"
    }
  ],
  "answerText": {
    "4b1c2d3e-0000-4a5b-8c9d-0e1f2a3b4c5d": "4",
    "9e8d7c6b-0000-4a5b-8c9d-0e1f2a3b4c5d": "Checkout rejects my card every time"
  },
  "attachments": [],
  "status": "in_progress",
  "assignees": [
    { "id": "66666666-6666-4666-8666-666666666666", "name": "Ana Ruiz", "email": "ana@example.com" }
  ],
  "ai": {
    "type": "bug",
    "urgency": "high",
    "theme": { "id": "44444444-4444-4444-8444-444444444444", "name": "Checkout errors" },
    "category": { "id": "55555555-5555-4555-8555-555555555555", "name": "Payments" },
    "sentiment": "negative",
    "analyzedAt": "2026-09-30T10:00:07.250Z",
    "corrected": false
  },
  "commentsCount": 2
}
```

## Fields

**id** `string`

The response id, a UUID.

**url** `string`

A link that opens the response in your Usertick inbox.

**survey** `object`

`{ id, name }`. Usertick doesn't return or send the responses of a deleted survey, so `name` is null only when the survey is deleted while the response is being read.

**site** `object | null`

`{ id, domain }`, the website the response came from. Null for link, QR and email surveys.

**createdAt** `string`

When the response was received.

**updatedAt** `string`

The latest of: when it was received, when it was analyzed, and the last change a person or an integration made to its status, type, urgency, assignees, notes or analysis. Use it with `updatedSince` to [keep a copy in sync](https://docs.usertick.com/developers/api/pagination.md#keep-a-copy-in-sync).

**source** `string | null`

How it was collected: `widget`, `link`, `email` or `api`.

**language** `string | null`

The language the respondent answered in.

**country** `string | null`

Two letter country code (ISO 3166-1).

**pageUrl** `string | null`

The page the response was sent from.

**device** `object | null`

`{ type, browser, os }`. `type` is `desktop`, `tablet` or `mobile`: the device class the widget used for device targeting, or null for a response that carries none. Null when nothing is known.

**variant** `string | null`

The ID of the survey variant the respondent saw, such as `v_k3x9`. Null when the respondent saw no variant: on a survey without variants, or in **Everyone else**.

**variantName** `string | null`

The name of the variant in `variant`, as the survey names it. A variant removed from the survey keeps its name here. Null when `variant` is null or the variant has no name.

**contact** `object | null`

`{ id, email }`, the Usertick contact the response is linked to. Without a linked contact, `id` is null and `email` is the respondent's email (`respondent.email`). Null when neither is known. Webhook deliveries carry the same as API reads. See [how a response links to a contact](https://docs.usertick.com/installation/identify.md#how-a-response-links-to-a-contact).

**respondent** `object`

Who answered, from [`Usertick.identify()`](https://docs.usertick.com/installation/identify), a **Contact** question and the contact the response is linked to. The object is always present, and a field in it is null when it isn't known. Usertick never sends it to the AI.

**respondent**

**userId** `string | null`

Your own user id, as the page sent it with `identify()`.

**anonymousId** `string | null`

The browser's random visitor id. A new one starts after a logout, so it doesn't follow a person across logins. Null for link and email responses sent without one.

**verified** `boolean`

True when a valid user hash from your server came with the response.

**email** `string | null`

The respondent's email, in this order: the contact an email campaign was sent to, a verified email from `identify()`, a **Contact** question, an email from `identify()` without a valid hash. An answer to any other question type is never taken as the email.

**emailSource** `string | null`

Where `email` came from: `campaign`, `identify` or `contact_question`.

**name** `string | null`

The name `identify()` sent.

**company** `string | null`

The company `identify()` sent.

**traits** `object`

The other traits `identify()` sent, a flat object of strings, numbers and booleans. `{}` without any.

**traitsVerified** `boolean`

True when every trait came signed in the token.

**contactQuestion** `object | null`

What the respondent typed into a **Contact** question: the fields with a value, out of `name`, `email`, `phone`, `company` and `message`. Null without one.

**contact** `object | null`

`{ id }`, the contact the response is linked to.

**answers** `array`

The answered questions, in survey order. Answers to questions the survey no longer has come last.

**answer**

**questionId** `string`

The question's id. `GET /surveys/{surveyId}` lists the questions.

**question** `string | null`

The question's text. Null for a question the survey no longer has.

**type** `string | null`

The question type, for example `nps`, `rating`, `multiple_choice` or `text`.

**value** `any`

The answer as the respondent sent it: a number, a string, a boolean, an array or an object, depending on the question type.

**text** `string`

The answer as a person reads it. Choice labels are joined by ", ", a yes or no question reads Yes or No, and a number stays a number. A choice whose option was later deleted from the question keeps the label the option had.

**answerText** `object`

The same `text` values keyed by question id, which lets an automation map one answer to one field.

**attachments** `array`

Files the respondent sent, such as uploads, screenshots and signatures: `{ id, questionId, name, url }`. See [Download files](https://docs.usertick.com/developers/api/attachments.md).

**status** `string`

The inbox status: `open`, `planned`, `in_progress`, `resolved` or `archived`.

**assignees** `array`

The members assigned to the response: `{ id, name, email }`.

**ai** `object | null`

What Usertick AI read in the response, with any correction a person made folded in. Null until the response is analyzed, when the analysis was skipped or failed and nobody corrected it, and on every `response.created` delivery.

**ai**

**type** `string | null`

The feedback type of the strongest answer, or the type a person set: `bug`, `idea`, `complaint`, `question` or `praise`.

**urgency** `string | null`

`high`, `medium` or `low`.

**theme** `object | null`

`{ id, name }`. The ids match [the analysis tree](https://docs.usertick.com/developers/api/reference/list-themes.md). Null when the tree no longer has the theme.

**category** `object | null`

`{ id, name }`, the same way.

**sentiment** `string | null`

`negative`, `neutral` or `positive`.

**analyzedAt** `string | null`

When the analysis ran. Null when the values come only from a person's correction.

**corrected** `boolean`

True when a person changed one of these values. Their value wins over the AI's.

**commentsCount** `integer`

Notes on the response's timeline. Deleted notes are not counted.

## Behavior

* Every key is always present, and an empty value is `null`. The one exception is `change`, described below.
* To find one person's responses, [list responses](https://docs.usertick.com/developers/api/reference/list-responses.md) with `userId`, which matches your user id exactly, or with `email`, which matches an answer that is exactly that address, the email `identify()` sent, or the contact with that email and the responses linked to it.
* Question texts and choice labels come from the published survey, in English when the survey has it, otherwise in its first language.
* New fields can be added within v1, so your code should ignore the ones it doesn't know. See [Versioning](https://docs.usertick.com/developers/api/versioning.md).
* In a webhook delivery, `status`, `assignees` and `commentsCount` are read when the delivery is sent. The answers and the analysis are those of the event.
* `response.status_changed` and `response.classification_corrected` deliveries, and the status changes that `GET /responses/recent` lists, add a `change` key with the field that changed, its old and new value, and who changed it. See [What changed](https://docs.usertick.com/developers/webhooks/events.md#what-changed).
* To drop duplicate webhook deliveries, compare the delivery's `id` or the `webhook-id` header instead of the response `id`. See [Delivery and retries](https://docs.usertick.com/developers/webhooks/delivery.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.