## Create a new post **post** `/v2/posts` Creates a new post (feedback submission) in the specified board. ### Required Fields - `title` - Post title (minimum 2 characters) - `boardId` - Board ID to create the post in ### Optional Fields - `content` - Post content in HTML format - `tags` - Array of tag names to attach - `statusId` - Status ID to set (defaults to board's default status) - `commentsEnabled` - Whether comments are allowed (default: true) - `inReview` - Whether post is pending moderation (default: false) - `customFields` - Custom field values as key-value pairs - `eta` - Estimated completion date (Unix timestamp or ISO date) - `assigneeId` - Admin ID to assign this post to - `visibility` - Post-level visibility restriction: 'public' (no additional restrictions), 'authorOnly' (only author and admins), or 'companyOnly' (only users in author's company). Note: even 'public' posts are still subject to board-level and organization-level access controls. ### Author Attribution For posts created on behalf of users, use the `author` object: - `id` - Featurebase user ID - `userId` - External SSO user ID - `email` - User's email address - `name` - Display name - `profilePicture` - Profile picture URL Resolution priority: `id` > `userId` > `email` > authenticated user ### Backdating (Imports) - `createdAt` - Override creation date for importing historical data ### Response Returns the created post object with all fields populated. ### Header Parameters - `"Featurebase-Version": optional "2026-01-01.nova" or "2025-12-12.clover"` - `"2026-01-01.nova"` - `"2025-12-12.clover"` ### Body Parameters - `boardId: string` Board ID to create post in - `title: string` Post title - `assigneeId: optional string` Admin ID to assign this post to - `author: optional AuthorInput` Author to attribute the post to. If not provided, uses the authenticated user. Supports multiple identification methods: id (Featurebase ID), userId (external SSO ID), or email. - `id: optional string` Featurebase user ID to attribute content to - `email: optional string` Author email (used to find or create user) - `name: optional string` Author display name - `profilePicture: optional string` Author profile picture URL - `userId: optional string` External user ID from your system (matched via SSO) - `commentsEnabled: optional boolean` Whether comments are enabled on this post - `content: optional string` Post content (HTML) - `createdAt: optional string` Creation date (for backdating imports) - `customFields: optional map[array of string or boolean or number or 2 more]` Custom field values. Keys must be valid ObjectIds. Values can be: string, boolean, number, ISO date string, array of strings, ObjectId string, or null. - `array of string` - `boolean` - `number` - `string` - `string` - `eta: optional string` Estimated completion date - `inReview: optional boolean` Whether post is pending moderation - `integrations: optional object { clickup, discord, github, 3 more }` Push the created post to third-party integrations configured on your organization. Each integration must be explicitly set to true to trigger; omitted integrations will not be pushed to. - `clickup: optional boolean` Push to ClickUp - `discord: optional boolean` Push to Discord - `github: optional boolean` Push to GitHub - `jira: optional boolean` Push to Jira - `linear: optional boolean` Push to Linear - `slack: optional boolean` Push to Slack - `notifyAdmins: optional boolean` Whether to send email notifications to admins when this post is created. When true, admins will receive the same email notifications as when a post is created from the dashboard. Defaults to false (no emails sent). - `statusId: optional string` Status ID to set - `tags: optional string or array of string` Tag names to attach - `string` - `array of string` - `upvotes: optional number` Initial upvotes count. Defaults to 1 (post author is automatically added as voter). Use 0 to create a post without any votes. - `visibility: optional "public" or "authorOnly" or "companyOnly"` Post visibility. 'public' = visible to all users, 'authorOnly' = only visible to the author and admins, 'companyOnly' = only visible to users in the same company as the author - `"public"` - `"authorOnly"` - `"companyOnly"` ### Returns - `Post object { id, access, assigneeId, 20 more }` - `id: string` Unique identifier - `access: object { companyExternalIds, userIds }` - `companyExternalIds: array of 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 of 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` ID of the admin assigned to this post, null if unassigned - `author: object { id, email, name, 2 more }` - `id: string` Author unique identifier - `email: string` Author email (if available) - `name: string` Author display name - `profilePicture: string` Author profile picture URL - `type: "admin" or "customer" or "guest" or 3 more` Type of user who authored the post - `"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: map[unknown]` Custom field values keyed by field ID - `eta: string` Estimated completion time as ISO 8601 timestamp, null if not set - `features: object { commentsEnabled }` - `commentsEnabled: boolean` Whether comments are allowed on this post - `inReview: boolean` Whether the post is pending moderation review - `integrations: object { clickup, devops, github, 4 more }` Third-party integration links associated with this post - `clickup: array of object { id, title, url }` - `id: string` ClickUp task ID - `title: string` ClickUp task title - `url: string` URL to the ClickUp task - `devops: array of object { id, projectId, projectName, 2 more }` - `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 of object { id, number, repositoryFullName, 3 more }` - `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 of object { dealAmount, dealClosed, objectId, type }` - `dealAmount: number` Deal amount (for DEAL type) - `dealClosed: boolean` Whether the deal is closed (for DEAL type) - `objectId: number` HubSpot object ID - `type: "TICKET" or "DEAL" or "CONTACT"` HubSpot object type - `"TICKET"` - `"DEAL"` - `"CONTACT"` - `jira: array of object { issueId, issueUrl }` - `issueId: string` Jira issue ID - `issueUrl: string` URL to the Jira issue - `linear: array of object { issueId, issueUrl }` - `issueId: string` Linear issue ID - `issueUrl: string` URL to the Linear issue - `salesforce: array of object { amount, isClosed, objectId, objectType }` - `amount: number` Opportunity amount (for Opportunity type) - `isClosed: boolean` Whether the opportunity is closed (for Opportunity type) - `objectId: string` Salesforce record ID - `objectType: "Opportunity" or "Case"` Salesforce object type - `"Opportunity"` - `"Case"` - `isPinned: boolean` Whether the post is pinned to the top - `object: "post"` Object type identifier - `"post"` - `opportunityAmount: number` 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: 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 - `"post_status"` - `type: "reviewing" or "unstarted" or "active" or 2 more` The workflow stage this status represents - `"reviewing"` - `"unstarted"` - `"active"` - `"completed"` - `"canceled"` - `tags: array of object { id, color, name }` Tags attached to this post - `id: string` Tag unique identifier - `color: string` 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 ### Example ```http curl https://do.featurebase.app/v2/posts \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $FEATUREBASE_API_KEY" \ -d '{ "boardId": "507f1f77bcf86cd799439011", "title": "Add dark mode support", "assigneeId": "507f1f77bcf86cd799439013", "commentsEnabled": true, "content": "

It would be great to have dark mode.

", "createdAt": "2025-01-15T10:30:00.000Z", "customFields": { "507f1f77bcf86cd799439011": "high" }, "eta": "2025-12-31T23:59:59.000Z", "notifyAdmins": true, "statusId": "507f1f77bcf86cd799439012", "tags": [ "feature", "ui" ], "upvotes": 5, "visibility": "public" }' ``` #### Response ```json { "id": "507f1f77bcf86cd799439011", "access": { "companyExternalIds": [ "string" ], "userIds": [ "string" ] }, "assigneeId": "507f1f77bcf86cd799439013", "author": { "id": "507f1f77bcf86cd799439011", "email": "john@example.com", "name": "John Doe", "profilePicture": "https://cdn.example.com/avatars/john.png", "type": "customer" }, "boardId": "507f1f77bcf86cd799439011", "commentCount": 5, "content": "

It would be great to have a dark mode option for the dashboard.

", "createdAt": "2023-12-12T00:00:00.000Z", "customFields": { "cf_priority": "bar", "cf_effort": "bar" }, "eta": "2025-01-01T00:00:00.000Z", "features": { "commentsEnabled": true }, "inReview": false, "integrations": { "clickup": [ { "id": "86a1b2c3d", "title": "Add dark mode support", "url": "https://app.clickup.com/t/86a1b2c3d" } ], "devops": [ { "id": 1234, "projectId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "projectName": "My Project", "title": "Add dark mode support", "url": "https://dev.azure.com/org/project/_workitems/edit/1234" } ], "github": [ { "id": "1234567890", "number": "42", "repositoryFullName": "acme/backend", "repositoryName": "backend", "title": "Add dark mode support", "url": "https://github.com/acme/backend/issues/42" } ], "hubspot": [ { "dealAmount": 5000, "dealClosed": false, "objectId": 123456789, "type": "TICKET" } ], "jira": [ { "issueId": "10042", "issueUrl": "https://myteam.atlassian.net/browse/PROJ-123" } ], "linear": [ { "issueId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "issueUrl": "https://linear.app/team/issue/ENG-123" } ], "salesforce": [ { "amount": 25000, "isClosed": false, "objectId": "006Dn00000Abcdef", "objectType": "Opportunity" } ] }, "isPinned": false, "object": "post", "opportunityAmount": 30000, "postUrl": "https://feedback.example.com/p/add-dark-mode-support", "slug": "add-dark-mode-support", "status": { "id": "507f1f77bcf86cd799439011", "color": "Blue", "isDefault": false, "name": "In Progress", "object": "post_status", "type": "active" }, "tags": [ { "id": "507f1f77bcf86cd799439011", "color": "#FF5722", "name": "bug" } ], "title": "Add dark mode support", "updatedAt": "2023-12-13T00:00:00.000Z", "upvotes": 42 } ```