Update a post
Updates an existing post. Only provided fields will be modified.
Updatable Fields
title- Post title (minimum 2 characters)content- Post content in HTML formatboardId- Move post to a different boardstatusId- Update post statustags- Replace existing tags with new setcommentsEnabled- Enable/disable commentsinReview- Put post in/out of moderation queuecustomFields- Update custom field valueseta- Set estimated completion date (null to clear)createdAt- Update creation date (for backdating)assigneeId- Admin ID to assign this post to (null to unassign)visibility- Post-level restriction: 'public', 'authorOnly' (author and admins) or 'companyOnly' (the author's company). Board and organization access controls still apply.author- Change post attribution (id, userId, email, name, profilePicture)
Status Update Notifications
sendStatusUpdateEmail- When changing status, optionally send email notification to voters (default: false)
Response
Returns the updated post object with all fields populated.
Body
Admin ID to assign this post to (null to unassign)
507f1f77bcf86cd799439013Author to attribute the post to. If not provided, uses the authenticated user — unless source is given, in which case a guest author is synthesised from source.label (or the channel name), because a relayed request belongs to the customer who said it. Supports multiple identification methods: id (Featurebase ID), userId (external SSO ID), or email.
Custom field values keyed by field ID (ObjectId). Send each value in the form its field type takes: text: a string; number: a number or a numeric string ("5"); checkbox: true/false or "true"/"false"; date: an ISO 8601 string; select: an option label or id; multi-select: an option label or id, or an array of them. null clears a field. A value the field type cannot take is rejected with a 400.
Set the upvotes count directly. Use with caution as this overrides the actual vote count.
0 <= x10Response
Success
When kind is 'insight', where exactly the insight points back into its origin: an insight source record with character ranges into its fullText, or the native conversation/message/comment/post ids.
ID of the admin assigned to this post, null if unassigned
507f1f77bcf86cd799439013Post content in HTML format
<p>It would be great to have a dark mode option for the dashboard.</p>Present and true only on POST /v2/posts, when the request carried a source.externalId that already had a post. The existing post is returned unchanged with HTTP 200; a newly created post returns HTTP 201 without this field.
truetrueEstimated completion time as ISO 8601 timestamp, null if not set
2025-01-01T00:00:00.000ZWhen kind is 'insight', the triage grouping key (source record id, conversation id, origin post id, or the insight's own id for singletons). Legacy insights may be null and group as singletons.
Provenance of an insight: which channel it came from and how it was captured.
Present only on POST /v2/posts: the intakeMode the post was processed under ('request' when the request named none). On an idempotent replay (deduped: true) this is the mode the post was ORIGINALLY created with.
request, feedbackrequestDiscriminates an actionable work item ('issue') from a customer submission whose claims were extracted into insights ('record' — not a work item). Defaults to 'issue' for all pre-existing posts. Default list responses return issues only; pass kind='record' to opt in. Raw signal ('insight') is never returned by the posts resource — insights are served by /v2/insights.
issue, insight, recordissueNumber of insights linked to this issue as supporting evidence. Only meaningful when kind is 'issue'.
0When kind is 'insight', the ID of the issue this insight supports. Null when the insight is unlinked or when kind is 'issue'.
Total opportunity amount from linked HubSpot deals and Salesforce opportunities
30000True when the issue is hidden from portal/public surfaces. Missing stored values are returned as false.
falseFull URL to view the post
https://feedback.example.com/p/add-dark-mode-supportOn POST /v2/posts — queued: a processing run (claim extraction or the Organize rewrite) was enqueued and its result lands asynchronously on the post. skipped: nothing was enqueued; reason says which gate decided ('request_mode' for every intakeMode: 'request' create). existing: the create was an idempotent replay and the post was not processed again. On GET /v2/posts/{id} this field is present only for posts created with intakeMode: 'feedback' and reports how far that processing has got ('queued', 'processing', 'complete', 'needs_review', or 'skipped' with the same reason the create returned), with results listing what was made of the submission once the run has finished.