Feedback posts

View as Markdown

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"
}