Feedback posts
A feedback post is an idea on one of your boards. 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. |
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
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
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
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()
{
"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"
}