---
title: "Send feedback on an answer"
description: "Record your user's thumb, with an optional comment, on one answer of an API key's conversation. Free."
canonical: "https://lookio.app/docs/api/conversations/submit-answer-feedback"
updated: "2026-10-17"
---

# Send feedback on an answer

Requires `query`.

Use it to forward what a user of your product thought of an answer. `conversation_id` and `message_id` come from the answer: both are in the JSON answer and in the `done` event of a stream, and every message of [Get a conversation](/docs/api/conversations/get-conversation) has its `id`.

`rating` is `up`, `down` or `null`, which takes the thumb back. One answer holds one thumb: a new one replaces the old one and the totals follow. A `comment` goes only with `up` or `down`. Send `end_user` when you use end users: a conversation of another end user answers `resource_not_found`, like an answer id that is not in this conversation or that belongs to a question.

The thumb shows on the answer and in the workspace's logs, where `rating=down` finds the conversations to review. It costs nothing.

API keys only. A person's own chat answers `feature_not_available`: thumbs there are not available yet. See [Feedback on answers](/docs/platform/answer-feedback). This is not the endpoint that reports a problem with Lookio itself: that is [Submit feedback](/docs/api/feedback/submit-feedback).

```http
POST https://api.lookio.app/v1/conversations/{conversation_id}/messages/{message_id}/feedback
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Path parameters

- `conversation_id` (`string`, required, pattern: `^cnv_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`)
- `message_id` (`string`, required, pattern: `^msg_[abcdefghjkmnpqrstuvwxyz23456789]{12}$`)

## Header parameters

- `Idempotency-Key` (`string`, length: `1–255 chars`): A unique key for this request, such as a UUID, 1 to 255 visible ASCII characters. Send the same key when you retry: the first response is returned (with `Idempotent-Replayed: true`) instead of running the request again, for 24 hours, per credential. The same key on a different request is a 409 `conflict`. A streamed answer is not recorded.

## Body

`application/json`, required

- `rating` (`enum<string> | null`, required): `up` or `down`: your user's thumb on this answer. `null` takes it back. Sending another thumb replaces the first, it never counts twice.
- `comment` (`string`, length: `≤ 1000 chars`): What your user wrote with the thumb, up to 1,000 characters. Only with `up` or `down`.
- `end_user` (`string`, pattern: `^[\w.@:+\-]{1,200}$`): The `end_user` of the conversation, when you use them. When given, a conversation of another end user answers not found.

## Response

**200**: Send feedback on an answer

- `data` (`object`, required)
- `data.conversation_id` (`string`, required)
- `data.message_id` (`string`, required)
- `data.rating` (`enum<string> | null`, required)
- `data.comment` (`string,null`, required)
- `request_id` (`string`, required)

```json
{
  "data": {
    "conversation_id": "cnv_ca9xz837zsvb",
    "message_id": "msg_6ec9htp67dd7",
    "rating": "down",
    "comment": "The price is out of date."
  },
  "request_id": "req_01K9X7M2Q4"
}
```

**400**: Possible codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**401**: Possible codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked, invalid_access_key

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**403**: Possible codes: insufficient_scope, feature_not_available, admin_required, permission_denied

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**404**: Possible codes: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**409**: Possible codes: conflict, assistant_has_no_resources

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**413**: Possible codes: request_too_large

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**429**: Possible codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**500**: Possible codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>"
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request POST \
  --url 'https://api.lookio.app/v1/conversations/<conversation_id>/messages/<message_id>/feedback' \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "rating": "up"
}'
```
