---
title: "Update a post"
method: PATCH
path: "/posts/{postId}"
---

# Update a post

`PATCH /posts/{postId}`

## Request

- Base URL: `https://app.voteship.app/api/v1`
- URL: `https://app.voteship.app/api/v1/posts/{postId}`
- Auth: HTTP bearer

Update supplied fields atomically. ARCHIVED is accepted directly without a release. Leaving ARCHIVED clears releaseId. At least one editable field is required; notify alone is insufficient. API notification default is false. API PATCH does not send Slack/Discord messages.

## Path parameters

- `postId` string, required

## Request body

- object
  - `title` string
  - `description` string, nullable
  - `status` 'PENDING' | 'APPROVED' | 'IN_PROGRESS' | 'COMPLETE' | 'CLOSED' | 'ARCHIVED'
  - `tagIds` string[]
  - `metadata` object, nullable: Private context. Replaces the object; null clears it. Omitted from public responses; available to secret-key APIs and trusted admin webhooks.
  - `notify` boolean: Email post subscribers only on an actual status change. Defaults false. Audit records and webhooks still fire; external consumers control their own notifications.

## Response `200`

Updated post

- object
  - `data` Post
    - `id` string
    - `projectId` string
    - `title` string
    - `description` string, nullable
    - `status` 'PENDING' | 'APPROVED' | 'IN_PROGRESS' | 'COMPLETE' | 'CLOSED' | 'ARCHIVED'
    - `voteCount` integer
    - `metadata` object, nullable: Private context. Replaces the object; null clears it. Omitted from public responses; available to secret-key APIs and trusted admin webhooks.
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `404`: Post not found

---

[API](https://skmtc.dev/voteship/apis/voteship-api.md) · [All operations](https://skmtc.dev/voteship/apis/voteship-api/llms.txt) · [OpenAPI document](https://skmtc.dev/voteship/apis/voteship-api/revisions/51ab9e650f82?raw)
