Skip to content
Dashboard

Feedback

FeedbackBoards

Boards (post categories) organize feedback into distinct containers with their own settings.

List all boards
client.feedback.boards.list(BoardListParams { featurebaseVersion } params?, RequestOptionsoptions?): BoardListResponse { id, access, createdAt, 7 more }
GET/v2/boards
Get a board by ID
client.feedback.boards.retrieve(stringid, BoardRetrieveParams { featurebaseVersion } params?, RequestOptionsoptions?): Board { id, access, createdAt, 7 more }
GET/v2/boards/{id}
ModelsExpand Collapse
Board { id, access, createdAt, 7 more }
id: string

Unique identifier

access: Access { adminOnly, allowedRoles, deniedRoles, segments }
adminOnly: boolean

If true, only admins can see this board

allowedRoles: Array<string>

Role IDs allowed access (empty = all)

deniedRoles: Array<string>

Role IDs explicitly denied access

segments: Array<string>

Segment IDs that can access (empty = all)

createdAt: string

ISO 8601 timestamp when created

customFields: Array<string>

Custom field IDs attached to this board

features: Features { commentsEnabled, createdDatesVisible, postingEnabled }
commentsEnabled: boolean

Whether users can comment on posts

createdDatesVisible: boolean

Whether creation dates are visible on posts

postingEnabled: boolean

Whether users can create new posts

icon: EmojiIcon { type, value } | PredefinedIcon { type, value } | URLIcon { type, value } | null

The board’s icon. Can be one of three types:

  • emoji: A single emoji character (e.g., 💡, 🚀, ⭐)
  • icon: A predefined icon from the built-in library (e.g., lightbulb, bug, star)
  • url: A custom image URL (HTTPS required)

Can be null if no icon is set.

One of the following:
EmojiIcon { type, value }

An emoji character as the board icon

type: "emoji"

Emoji icon type

value: string

A single emoji character

PredefinedIcon { type, value }

A predefined icon from the built-in icon library

type: "icon"

Predefined icon type

value: string

Icon name from the predefined icon set (e.g., lightbulb, bug, star, rocket, flag, heart, check, question, megaphone, gift)

URLIcon { type, value }

A custom icon loaded from an external URL

type: "url"

External URL icon type

value: string

HTTPS URL to a custom icon image (PNG, SVG, or WebP recommended)

formaturi
localization: Localization { description, formPlaceholder, heroDescription, 3 more }
description: Record<string, string> | null

Localized description

formPlaceholder: Record<string, string> | null

Placeholder text in the post creation form

heroDescription: Record<string, string> | null

Hero description/subtitle

heroTitle: Record<string, string> | null

Hero title shown on the board page

name: Record<string, string>

Localized board name (language code → text)

submitButtonText: Record<string, string> | null

Submit button text

name: string

Display name in organization’s default locale

object: "board"

Object type identifier

postDefaults: PostDefaults { visibility }
visibility: "public" | "authorOnly" | "companyOnly"

Default visibility for new posts

One of the following:
"public"
"authorOnly"
"companyOnly"
BoardListResponse = Array<Board { id, access, createdAt, 7 more } >
id: string

Unique identifier

access: Access { adminOnly, allowedRoles, deniedRoles, segments }
adminOnly: boolean

If true, only admins can see this board

allowedRoles: Array<string>

Role IDs allowed access (empty = all)

deniedRoles: Array<string>

Role IDs explicitly denied access

segments: Array<string>

Segment IDs that can access (empty = all)

createdAt: string

ISO 8601 timestamp when created

customFields: Array<string>

Custom field IDs attached to this board

features: Features { commentsEnabled, createdDatesVisible, postingEnabled }
commentsEnabled: boolean

Whether users can comment on posts

createdDatesVisible: boolean

Whether creation dates are visible on posts

postingEnabled: boolean

Whether users can create new posts

icon: EmojiIcon { type, value } | PredefinedIcon { type, value } | URLIcon { type, value } | null

The board’s icon. Can be one of three types:

  • emoji: A single emoji character (e.g., 💡, 🚀, ⭐)
  • icon: A predefined icon from the built-in library (e.g., lightbulb, bug, star)
  • url: A custom image URL (HTTPS required)

Can be null if no icon is set.

One of the following:
EmojiIcon { type, value }

An emoji character as the board icon

type: "emoji"

Emoji icon type

value: string

A single emoji character

PredefinedIcon { type, value }

A predefined icon from the built-in icon library

type: "icon"

Predefined icon type

value: string

Icon name from the predefined icon set (e.g., lightbulb, bug, star, rocket, flag, heart, check, question, megaphone, gift)

URLIcon { type, value }

A custom icon loaded from an external URL

type: "url"

External URL icon type

value: string

HTTPS URL to a custom icon image (PNG, SVG, or WebP recommended)

formaturi
localization: Localization { description, formPlaceholder, heroDescription, 3 more }
description: Record<string, string> | null

Localized description

formPlaceholder: Record<string, string> | null

Placeholder text in the post creation form

heroDescription: Record<string, string> | null

Hero description/subtitle

heroTitle: Record<string, string> | null

Hero title shown on the board page

name: Record<string, string>

Localized board name (language code → text)

submitButtonText: Record<string, string> | null

Submit button text

name: string

Display name in organization’s default locale

object: "board"

Object type identifier

postDefaults: PostDefaults { visibility }
visibility: "public" | "authorOnly" | "companyOnly"

Default visibility for new posts

One of the following:
"public"
"authorOnly"
"companyOnly"

FeedbackPosts

User-submitted feedback and feature requests. Posts belong to boards and can be upvoted, commented on, and tracked through statuses.

List all posts
client.feedback.posts.list(PostListParams { boardId, cursor, inReview, 7 more } params?, RequestOptionsoptions?): CursorPage<Post { id, access, assigneeId, 20 more } >
GET/v2/posts
Create a new post
client.feedback.posts.create(PostCreateParams { boardId, title, assigneeId, 14 more } params, RequestOptionsoptions?): Post { id, access, assigneeId, 20 more }
POST/v2/posts
Get a post by ID
client.feedback.posts.retrieve(stringid, PostRetrieveParams { featurebaseVersion } params?, RequestOptionsoptions?): Post { id, access, assigneeId, 20 more }
GET/v2/posts/{id}
Update a post
client.feedback.posts.update(stringid, PostUpdateParams { assigneeId, author, boardId, 13 more } params, RequestOptionsoptions?): Post { id, access, assigneeId, 20 more }
PATCH/v2/posts/{id}
Delete a post
client.feedback.posts.delete(stringid, PostDeleteParams { featurebaseVersion } params?, RequestOptionsoptions?): PostDeleteResponse { id, deleted, object }
DELETE/v2/posts/{id}
ModelsExpand Collapse
Post { id, access, assigneeId, 20 more }
id: string

Unique identifier

access: Access { companyExternalIds, userIds }
companyExternalIds: Array<string>

External company IDs explicitly granted access to this post. Empty array means no company-level restrictions. Non-empty means only users belonging to these companies can see the post.

userIds: Array<string>

User IDs explicitly granted access to this post. Empty array means no user-level restrictions (post uses board/org visibility). Non-empty means only these users (plus admins) can see the post.

assigneeId: string | null

ID of the admin assigned to this post, null if unassigned

author: Author | null
id: string | null

Author unique identifier

email: string | null

Author email (if available)

name: string

Author display name

profilePicture: string | null

Author profile picture URL

type: "admin" | "customer" | "guest" | 3 more

Type of user who authored the post

One of the following:
"admin"
"customer"
"guest"
"integration"
"bot"
"lead"
boardId: string

Board (category) ID this post belongs to

commentCount: number

Total number of comments

content: string

Post content in HTML format

createdAt: string

ISO 8601 timestamp when created

customFields: Record<string, unknown>

Custom field values keyed by field ID

eta: string | null

Estimated completion time as ISO 8601 timestamp, null if not set

features: Features { commentsEnabled }
commentsEnabled: boolean

Whether comments are allowed on this post

inReview: boolean

Whether the post is pending moderation review

integrations: Integrations { clickup, devops, github, 4 more }

Third-party integration links associated with this post

clickup: Array<Clickup>
id: string

ClickUp task ID

title: string

ClickUp task title

url: string

URL to the ClickUp task

devops: Array<Devop>
id: number

Azure DevOps work item ID

projectId: string

Azure DevOps project ID

projectName: string

Azure DevOps project name

title: string

Work item title

url: string

URL to the work item

github: Array<GitHub>
id: string

GitHub issue ID

number: string

GitHub issue number

repositoryFullName: string

Full repository name (owner/repo)

repositoryName: string

Repository name

title: string

GitHub issue title

url: string

URL to the GitHub issue

hubspot: Array<Hubspot>
dealAmount: number | null

Deal amount (for DEAL type)

dealClosed: boolean | null

Whether the deal is closed (for DEAL type)

objectId: number

HubSpot object ID

type: "TICKET" | "DEAL" | "CONTACT"

HubSpot object type

One of the following:
"TICKET"
"DEAL"
"CONTACT"
jira: Array<Jira>
issueId: string

Jira issue ID

issueUrl: string | null

URL to the Jira issue

linear: Array<Linear>
issueId: string

Linear issue ID

issueUrl: string | null

URL to the Linear issue

salesforce: Array<Salesforce>
amount: number | null

Opportunity amount (for Opportunity type)

isClosed: boolean | null

Whether the opportunity is closed (for Opportunity type)

objectId: string

Salesforce record ID

objectType: "Opportunity" | "Case"

Salesforce object type

One of the following:
"Opportunity"
"Case"
isPinned: boolean

Whether the post is pinned to the top

object: "post"

Object type identifier

opportunityAmount: number | null

Total opportunity amount from linked HubSpot deals and Salesforce opportunities

postUrl: string

Full URL to view the post

slug: string

URL-friendly slug

status: PostStatus { id, color, isDefault, 3 more }
id: string

Unique identifier

color: string

Color for UI display

isDefault: boolean

Whether this is the default status for new posts

name: string

Display name

object: "post_status"

Object type identifier

type: "reviewing" | "unstarted" | "active" | 2 more

The workflow stage this status represents

One of the following:
"reviewing"
"unstarted"
"active"
"completed"
"canceled"
tags: Array<Tag>

Tags attached to this post

id: string

Tag unique identifier

color: string | null

Tag color hex code

name: string

Tag name

title: string

Post title

updatedAt: string

ISO 8601 timestamp when last modified

upvotes: number

Total number of upvotes

PostDeleteResponse { id, deleted, object }
id: string

Unique identifier of the deleted post

deleted: true

Indicates the resource was deleted

object: "post"

Object type identifier

FeedbackPostsVoters

User-submitted feedback and feature requests. Posts belong to boards and can be upvoted, commented on, and tracked through statuses.

List voters on a post
client.feedback.posts.voters.list(stringid, VoterListParams { cursor, limit, featurebaseVersion } params?, RequestOptionsoptions?): CursorPage<VoterListResponse { id, name, object, 16 more } >
GET/v2/posts/{id}/voters
Add a voter to a post
client.feedback.posts.voters.add(stringid, VoterAddParams { id, email, name, 3 more } params, RequestOptionsoptions?): VoterAddResponse { id, added, object, postId }
POST/v2/posts/{id}/voters
Remove a voter from a post
client.feedback.posts.voters.remove(stringid, VoterRemoveParams { id, email, userId, featurebaseVersion } params, RequestOptionsoptions?): VoterRemoveResponse { id, object, postId, removed }
DELETE/v2/posts/{id}/voters
ModelsExpand Collapse
VoterListResponse { id, name, object, 16 more }
id: string

Unique identifier

name: string

User display name

object: "contact"

Object type identifier

type: "admin" | "customer" | "guest" | 3 more

Type of user

One of the following:
"admin"
"customer"
"guest"
"integration"
"bot"
"lead"
commentsCreated?: number

Number of comments created

companies?: Array<Company { id, companyId, companySize, 11 more } >

Companies the user belongs to

id: string

Featurebase internal ID

companyId: string

External company ID from your system

companySize: number | null

Company employee headcount

createdAt: string | null

ISO date when company was created

industry: string | null

Industry

lastActivity: string | null

ISO date of last activity

linkedUsers: number | null

Number of users linked to this company

monthlySpend: number | null

Monthly spend

name: string

Company name

object: "company"

Object type identifier

plan: string | null

Plan or tier name

updatedAt: string | null

ISO date when company was last updated

website: string | null

Company website URL

customFields?: Record<string, unknown>

Custom field values

customFields?: Record<string, unknown>

Custom field values on the user

description?: string

User description/bio

email?: string | null

User email

lastActivity?: string

Last activity ISO timestamp

locale?: string

User locale

manuallyOptedOutFromChangelog?: boolean

Whether manually opted out from changelog

organizationId?: string

Organization ID the user belongs to

postsCreated?: number

Number of posts created

profilePicture?: string | null

Profile picture URL

roles?: Array<string>

User roles

subscribedToChangelog?: boolean

Whether subscribed to changelog

userId?: string

External user ID from SSO

verified?: boolean

Whether email is verified

VoterAddResponse { id, added, object, postId }
id: string

Voter unique identifier

added: true

Indicates the voter was added

object: "voter"

Object type identifier

postId: string

Post ID the voter was added to

VoterRemoveResponse { id, object, postId, removed }
id: string

Voter unique identifier

object: "voter"

Object type identifier

postId: string

Post ID the voter was removed from

removed: true

Indicates the voter was removed

FeedbackPost Statuses

Post statuses define the workflow stages for posts (e.g., In Review, Active, Completed).

List all post statuses
client.feedback.postStatuses.list(PostStatusListParams { featurebaseVersion } params?, RequestOptionsoptions?): PostStatusListResponse { id, color, isDefault, 3 more }
GET/v2/post_statuses
Get a post status by ID
client.feedback.postStatuses.retrieve(stringid, PostStatusRetrieveParams { featurebaseVersion } params?, RequestOptionsoptions?): PostStatus { id, color, isDefault, 3 more }
GET/v2/post_statuses/{id}
ModelsExpand Collapse
PostStatus { id, color, isDefault, 3 more }
id: string

Unique identifier

color: string

Color for UI display

isDefault: boolean

Whether this is the default status for new posts

name: string

Display name

object: "post_status"

Object type identifier

type: "reviewing" | "unstarted" | "active" | 2 more

The workflow stage this status represents

One of the following:
"reviewing"
"unstarted"
"active"
"completed"
"canceled"
PostStatusListResponse = Array<PostStatus { id, color, isDefault, 3 more } >
id: string

Unique identifier

color: string

Color for UI display

isDefault: boolean

Whether this is the default status for new posts

name: string

Display name

object: "post_status"

Object type identifier

type: "reviewing" | "unstarted" | "active" | 2 more

The workflow stage this status represents

One of the following:
"reviewing"
"unstarted"
"active"
"completed"
"canceled"

FeedbackComments

Threaded discussions on posts and changelogs. Comments support voting, moderation, and privacy controls.

List comments
client.feedback.comments.list(CommentListParams { changelogId, cursor, inReview, 5 more } params?, RequestOptionsoptions?): CursorPage<Comment { id, author, changelogId, 14 more } >
GET/v2/comments
Create a new comment
client.feedback.comments.create(CommentCreateParams { content, author, changelogId, 8 more } params, RequestOptionsoptions?): Comment { id, author, changelogId, 14 more }
POST/v2/comments
Get a comment by ID
client.feedback.comments.retrieve(stringid, CommentRetrieveParams { featurebaseVersion } params?, RequestOptionsoptions?): Comment { id, author, changelogId, 14 more }
GET/v2/comments/{id}
Update a comment
client.feedback.comments.update(stringid, CommentUpdateParams { content, createdAt, downvotes, 5 more } params, RequestOptionsoptions?): Comment { id, author, changelogId, 14 more }
PATCH/v2/comments/{id}
Delete a comment
client.feedback.comments.delete0(stringid, CommentDelete0Params { featurebaseVersion } params?, RequestOptionsoptions?): CommentDelete0Response { id, deleted, object }
DELETE/v2/comments/{id}
Delete a comment
client.feedback.comments.delete1(CommentDelete1Params { id, featurebaseVersion } params, RequestOptionsoptions?): CommentDelete1Response { success }
DELETE/v2/comment
ModelsExpand Collapse
Comment { id, author, changelogId, 14 more }
id: string

Unique identifier

author: Author | null
id: string | null

Author unique identifier

name: string

Author display name

profilePicture: string | null

Author profile picture URL

type: "admin" | "customer" | "guest" | 3 more

Type of user who authored the comment

One of the following:
"admin"
"customer"
"guest"
"integration"
"bot"
"lead"
changelogId: string | null

Changelog ID this comment belongs to

content: string

Comment content in HTML format

createdAt: string

ISO 8601 timestamp when created

downvotes: number

Number of downvotes

inReview: boolean

Whether the comment is in review

isDeleted: boolean

Whether the comment is deleted

isPinned: boolean

Whether the comment is pinned

isPrivate: boolean

Whether the comment is private

isSpam: boolean

Whether the comment is spam

object: "comment"

Object type identifier

parentCommentId: string | null

Parent comment ID for replies, null for root comments

postId: string | null

Post ID this comment belongs to

score: number

Net score (upvotes - downvotes)

updatedAt: string

ISO 8601 timestamp when updated

upvotes: number

Number of upvotes

CommentDelete0Response { id, deleted, object }
id: string

Unique identifier of the deleted comment

deleted: true

Indicates the resource was deleted

object: "comment"

Object type identifier

CommentDelete1Response { success }
success: boolean

FeedbackCustom Fields

Configurable input fields for posts in your Featurebase organization. Custom fields allow you to collect additional structured data when users create posts.

List custom fields
client.feedback.customFields.list(CustomFieldListParams { featurebaseVersion } params?, RequestOptionsoptions?): CustomFieldList { data, nextCursor, object, pagination }
GET/v2/custom_fields
Get a custom field by ID
client.feedback.customFields.retrieve(stringid, CustomFieldRetrieveParams { featurebaseVersion } params?, RequestOptionsoptions?): CustomField { id, label, object, 9 more }
GET/v2/custom_fields/{id}
ModelsExpand Collapse
CustomField { id, label, object, 9 more }
id: string

Unique identifier

label: string

Field label displayed to users

object: "custom_field"

Object type identifier

type: "text" | "number" | "select" | 4 more

Field type

One of the following:
"text"
"number"
"select"
"multi-select"
"checkbox"
"date"
"file"
allowMultiple?: boolean

Whether multiple files can be uploaded (file fields only)

createdAt?: string

ISO timestamp when created

internal?: boolean

Whether the field is for internal use only

options?: Array<Option>

Options for select/multi-select fields

id: string

Option unique identifier

label: string

Option display label

placeholder?: string

Placeholder text

public?: boolean

Whether the field value is publicly visible

required?: boolean

Whether the field is required

updatedAt?: string

ISO timestamp when last updated

CustomFieldList { data, nextCursor, object, pagination }
data: Array<CustomField { id, label, object, 9 more } >

Array of custom fields

id: string

Unique identifier

label: string

Field label displayed to users

object: "custom_field"

Object type identifier

type: "text" | "number" | "select" | 4 more

Field type

One of the following:
"text"
"number"
"select"
"multi-select"
"checkbox"
"date"
"file"
allowMultiple?: boolean

Whether multiple files can be uploaded (file fields only)

createdAt?: string

ISO timestamp when created

internal?: boolean

Whether the field is for internal use only

options?: Array<Option>

Options for select/multi-select fields

id: string

Option unique identifier

label: string

Option display label

placeholder?: string

Placeholder text

public?: boolean

Whether the field value is publicly visible

required?: boolean

Whether the field is required

updatedAt?: string

ISO timestamp when last updated

nextCursor: string | null

Cursor for fetching the next page (cursor-based pagination)

object: "list"

Object type identifier