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}
Search posts
client.feedback.posts.search(PostSearchParams { cursor, limit, query, 3 more } params, RequestOptionsoptions?): PostSearchResponse { data, nextCursor, object, 2 more }
POST/v2/posts/search
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

PostSearchResponse { data, nextCursor, object, 2 more }
data: Array<Data>

Array of search results

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

nextCursor: string | null

Cursor for fetching the next page (null if no more results)

object: "list"

Object type identifier

totalCount?: number

Total number of posts matching the query, capped at 5000. When the actual total is at or above the cap, totalCountCapped is true and the value is exactly the cap.

totalCountCapped?: boolean

True when totalCount is exactly the cap and the real count may be higher. UI can render as e.g. “5000+”.

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
Search comments
client.feedback.comments.search(CommentSearchParams { cursor, limit, query, 3 more } params, RequestOptionsoptions?): CommentSearchResponse { data, nextCursor, object, 2 more }
POST/v2/comments/search
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
CommentSearchResponse { data, nextCursor, object, 2 more }
data: Array<Data>

Array of search results

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

nextCursor: string | null

Cursor for fetching the next page (null if no more results)

object: "list"

Object type identifier

totalCount?: number

Total number of comments matching the query, capped at 5000 in filter mode and 200 (the Turbopuffer top-K) in search mode. When at the cap, totalCountCapped is true and the value is exactly the cap.

totalCountCapped?: boolean

True when totalCount is exactly the cap and the real count may be higher. UI can render as e.g. “5000+”.

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