# Feedback posts

> Read the ideas on your boards and file new ones.

A feedback post is an idea on one of your [boards](https://tirver.com/help/feedback-boards-and-posts.md). Its status decides whether it shows on your roadmap. If the workspace has switched the feedback module off, these endpoints answer `404` with `module_disabled`.

## The feedback post object

| Field | Type | Meaning |
|---|---|---|
| `id` | string | The post id. |
| `title` | string | The idea in a line. |
| `body` | string | More detail, as text. |
| `status` | string | `open` (shown as In review), `planned`, `in_progress`, `shipped` or `declined`. |
| `board_id` | string or null | The board it belongs to. |
| `customer_id` | string or null | The author, when the post came from a customer. |
| `vote_count` | integer | How many votes it has. |
| `source_conversation_id` | string or null | The conversation it was created from. |
| `changelog_entry_id` | string or null | The changelog entry that announced it. |
| `created_at` | string | When it was posted. |
| `updated_at` | string | When it last changed. |

Fetching a single post adds `comments`, each with `id`, `author_kind` (`team` or `customer`), `author_id`, `body` and `created_at`.

## List boards

`GET /api/v1/feedback/boards`

Needs the `feedback:read` scope. Returns every board, not paged, each with `id`, `slug` and `name`.

## List feedback posts

`GET /api/v1/feedback/posts`

Needs `feedback:read`. Newest first. Posts that were merged into another post as duplicates are not listed.

| Parameter | Type | What it does |
|---|---|---|
| `status` | string | Only posts with this status. |
| `board_id` | string | Only posts on this board. |
| `q` | string | Search the title and details. |
| `limit` | integer | Page size, 1 to 100. Defaults to 25. |
| `cursor` | string | The `next_cursor` from the previous page. |

```bash
curl "https://app.tirver.com/api/v1/feedback/posts?status=planned" \
  -H "Authorization: Bearer $TIRVER_API_KEY"
```

## Get a feedback post

`GET /api/v1/feedback/posts/{id}`

Needs `feedback:read`. Returns one post with its comments.

## Create a feedback post

`POST /api/v1/feedback/posts`

Needs `feedback:write`. The post starts with the status `open`. Returns `201` with the post.

| Field | Type | What it does |
|---|---|---|
| `title` | string | Required. Up to 160 characters. |
| `body` | string | Optional. More detail, up to 8,000 characters. |
| `board_id` | string | Optional. The board to post on. |
| `conversation_id` | string | Optional. Links the post to the conversation it came from and to that conversation's customer, who gets the first vote. A conversation can have one post, so a second one gives `409`. |

**curl**

```bash
curl https://app.tirver.com/api/v1/feedback/posts \
  -H "Authorization: Bearer $TIRVER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Dark mode for the booking page", "conversation_id": "8c1f0d52"}'
```

**JavaScript**

```js
const res = await fetch('https://app.tirver.com/api/v1/feedback/posts', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.TIRVER_API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ title: 'Dark mode for the booking page', conversation_id: '8c1f0d52' }),
});
const post = await res.json();
```

**Python**

```python
res = requests.post(
    "https://app.tirver.com/api/v1/feedback/posts",
    headers={"Authorization": f"Bearer {os.environ['TIRVER_API_KEY']}"},
    json={"title": "Dark mode for the booking page", "conversation_id": "8c1f0d52"},
    timeout=10,
)
post = res.json()
```

```json
{
  "id": "a41c9e07",
  "title": "Dark mode for the booking page",
  "body": "",
  "status": "open",
  "board_id": null,
  "customer_id": "3b7a91e4",
  "vote_count": 1,
  "source_conversation_id": "8c1f0d52",
  "changelog_entry_id": null,
  "created_at": "2026-11-14T10:15:00.000Z",
  "updated_at": "2026-11-14T10:15:00.000Z"
}
```

Source: https://tirver.com/help/api/feedback-posts
