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

# feed.text.received

This webhook is triggered whenever a new text review is received in the Feedspace workspace the webhook belongs to.

## Webhook Type

`feed.text.received`

## Payload Format

```json theme={null}
{
  "type": "feed.text.received",
  "data": {
    "project": {
      "logo": "LOGO_URL",
      "name": "PROJECT_NAME",
      "description": "PROJECT_DESCRIPTION"
    },
    "feed_form": {
      "id": "FORM_SLUG",
      "url": "FORM_URL",
      "logo": "FORM_LOGO_URL",
      "name": "FORM_NAME"
    },
    "feed_id": "FEED_ID",
    "feed_url": "FEED_URL",
    "attachments": [
      {
        "type": "image",
        "image_url": "IMAGE_URL",
        "image_extension": "jpg",
        "image_size": 84213
      },
      {
        "type": "video",
        "thumbnail_url": "THUMBNAIL_IMAGE_URL",
        "video_url": "VIDEO_FILE_URL",
        "video_extension": "mp4",
        "video_size": 1048576
      },
      {
        "type": "audio",
        "audio_url": "AUDIO_FILE_URL",
        "audio_extension": "mp3",
        "audio_size": 204800
      }
    ],
    "response": {
      "name": "RESPONDER_NAME",
      "email": "RESPONDER_EMAIL",
      "consent": true,
      "position": "RESPONDER_POSITION",
      "organization_name": "RESPONDER_ORGANIZATION_NAME",
      "contact_number": "RESPONDER_PHONE_NUMBER",
      "photo": "RESPONDER_PHOTO_URL",
      "company_logo": "RESPONDER_COMPANY_LOGO_URL",
      "company_url": "RESPONDER_COMPANY_URL",
      "other_text": "ANSWER_TO_CUSTOM_FIELD",
      "other_text2": "ANSWER_TO_CUSTOM_FIELD_2",
      "other_text3": "ANSWER_TO_CUSTOM_FIELD_3",
      "comment": "REVIEW_COMMENT",
      "type": "star",
      "value": "5"
    },
    "favourite": false,
    "created_at": "TIMESTAMP",
    "updated_at": "TIMESTAMP",
    "live_mode": true
  },
  "reviewer_email": "RESPONDER_EMAIL"
}
```

`type`, `data` and `reviewer_email` are the only top-level keys. `reviewer_email` is the email answer lifted out of `data.response`, and is `null` when the form did not collect one.

## Object Structure

### Project Object

The `project` object contains information about the workspace/project where the review was submitted.

```json theme={null}
{
  "logo": "LOGO_URL",
  "name": "PROJECT_NAME",
  "description": "PROJECT_DESCRIPTION"
}
```

#### Project Fields

* `logo`: URL to the project's logo image
* `name`: Name of the project/workspace
* `description`: Description or identifier for the project

### Feed Form Object

The `feed_form` object contains information about the review form used to collect the feedback.

```json theme={null}
{
  "id": "FORM_SLUG",
  "url": "FORM_URL",
  "logo": "FORM_LOGO_URL",
  "name": "FORM_NAME"
}
```

#### Feed Form Fields

* `id`: The form's public slug, the same identifier that appears in the form's public URL. This is **not** the `unique_form_id` used by the Review Forms API, so it cannot be passed to those endpoints.
* `url`: Public URL where the form can be accessed
* `logo`: URL to the form's page image. Only present when the form has a page image configured, so treat it as optional.
* `name`: Name or title of the review form

### Response Object

The `response` object contains the actual review data submitted by the user.

```json theme={null}
{
  "name": "RESPONDER_NAME",
  "email": "RESPONDER_EMAIL",
  "consent": true,
  "position": "RESPONDER_POSITION",
  "organization_name": "RESPONDER_ORGANIZATION_NAME",
  "contact_number": "PHONE_NUMBER",
  "photo": "PHOTO_URL",
  "company_logo": "COMPANY_LOGO_URL",
  "company_url": "COMPANY_URL",
  "other_text": "ANSWER_TO_CUSTOM_FIELD",
  "other_text2": "ANSWER_TO_CUSTOM_FIELD_2",
  "other_text3": "ANSWER_TO_CUSTOM_FIELD_3",
  "comment": "REVIEW_COMMENT",
  "type": "star",
  "value": "5"
}
```

#### Fields

* `name`: Name of the person who submitted the review
* `email`: Email address of the reviewer
* `consent`: Whether the reviewer gave consent to share their information
* `position`: Position or role of the reviewer
* `organization_name`: Name of the organization of the reviewer
* `contact_number`: Phone number of the reviewer
* `photo`: URL to the reviewer's photo
* `company_logo`: URL to the reviewer's company logo
* `company_url`: Website URL of the reviewer's company
* `other_text`: Answer of the custom field added by the Feedspace user in the feed form settings
* `other_text2`: Answer of the second custom field, when the form defines one
* `other_text3`: Answer of the third custom field, when the form defines one
* `comment`: The actual text content of the review
* `type`: Type of review (`"star"`, `"thumbs_up"` or `"comment_only"`)
* `value`: Value corresponding to the review type
  * For `type` `"star"`: the rating as a **string**, e.g. `"5"`, not a number
  * For `type` `"thumbs_up"`: a real boolean, `true` = upvote, `false` = downvote
  * For `type` `"comment_only"`: `value` is `null`

The keys of this object are the raw question identifiers of the form, which is why they are lowercase. Forms created before the identifiers were normalised may still send capitalised keys such as `Name`, `Email` or `Photo`, so match case-insensitively if you need to support older forms.

Note: All fields in this object are customizable. They can be enabled or disabled in the feed form settings. If a field is not enabled in the form settings, it will not be included in the webhook response. `comment`, `type` and `value` are always present.

### Attachments

If the review has media attached, `data.attachments` is present as an array. The key is omitted entirely when the review has no attachments. Every item carries a `type` field, and the remaining fields depend on that type.

```json theme={null}
[
  {
    "type": "image",
    "image_url": "IMAGE_URL",
    "image_extension": "jpg",
    "image_size": 84213
  },
  {
    "type": "video",
    "thumbnail_url": "THUMBNAIL_IMAGE_URL",
    "video_url": "VIDEO_FILE_URL",
    "video_extension": "mp4",
    "video_size": 1048576
  },
  {
    "type": "audio",
    "audio_url": "AUDIO_FILE_URL",
    "audio_extension": "mp3",
    "audio_size": 204800
  }
]
```

#### Attachment Fields

* `type`: One of `"image"`, `"video"` or `"audio"`
* For `"image"`: `image_url`, `image_extension`, and `image_size` in bytes (integer, `null` if unknown)
* For `"video"`: `thumbnail_url` (empty string `""` when no thumbnail exists), `video_url`, `video_extension`, and `video_size` in bytes (integer, `null` if unknown)
* For `"audio"`: `audio_url`, `audio_extension`, and `audio_size` in bytes (integer, `null` if unknown)

When a text review is submitted with a video or audio attachment, the webhook is not sent immediately. It fires once the media has finished processing, so the attachment URLs in the payload are always ready to use.

### Top-Level Fields

```json theme={null}
{
  "feed_id": "FEED_ID",
  "feed_url": "FEED_URL",
  "favourite": false,
  "created_at": "TIMESTAMP",
  "updated_at": "TIMESTAMP",
  "live_mode": true
}
```

#### Top-Level Field Descriptions

* `feed_id`: Unique identifier for this specific review
* `feed_url`: Public URL where the review is accessible
* `favourite`: Whether this review is marked as favorite
* `created_at`: Timestamp when the review was created
* `updated_at`: Timestamp when the review was last updated
* `live_mode`: Whether this is a live mode (true) or test mode (false)
