## Merge two posts

**post** `/v2/posts/merge`

Merges a source post into a destination post.

The source post is removed from public post lists. Its votes, comments,
and supported integration links are moved to the destination post.

Both posts must belong to the authenticated organization. Neither post can
already be merged, and a post cannot be merged into itself.

Retrying the same source and destination after a successful merge is safe and
returns the destination post without merging the data again.

The response contains the updated destination post.

### Header Parameters

- `"Featurebase-Version": optional "2026-01-01.nova" or "2025-12-12.clover"`

  - `"2026-01-01.nova"`

  - `"2025-12-12.clover"`

### Body Parameters

- `destinationPostId: string`

  ID of the post that receives the source post data

- `sourcePostId: string`

  ID of the post to merge into the destination post

### Returns

- `Post object { id, access, assigneeId, 20 more }`

  - `id: string`

    Unique identifier

  - `access: PostAccess`

    - `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: PostAuthor`

    - `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: PostFeatures`

    - `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 PostTag`

    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/merge \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer $FEATUREBASE_API_KEY" \
    -d '{
          "destinationPostId": "507f1f77bcf86cd799439012",
          "sourcePostId": "507f1f77bcf86cd799439011"
        }'
```

#### 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": "<p>It would be great to have a dark mode option for the dashboard.</p>",
  "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
}
```
