---
title: "Publish, unpublish, or delete many CMS posts at once"
method: POST
path: "/cms/posts/bulk"
tags: ["CMS"]
---

# Publish, unpublish, or delete many CMS posts at once

`POST /cms/posts/bulk`

## Request

- Base URL: `https://next.frase.io/api/v1`
- URL: `https://next.frase.io/api/v1/cms/posts/bulk`
- Auth: one of:
  - API key in header `X-API-KEY`
  - HTTP bearer

Applies one lifecycle action to up to 25 posts in a single request. Each post is processed independently: one failure never aborts the batch, and every id comes back in either `succeeded` or `failed` with a machine-readable `code`. Duplicate ids are deduplicated (first occurrence wins) before processing, so `counts.requested` reflects the deduplicated set. A 200 means the batch was processed, not that every id succeeded - always inspect `failed`. The `delete` action additionally requires the `delete:content` scope.

## Request body

- object
  - `action` 'publish' | 'unpublish' | 'delete', required
  - `post_ids` string[], required

## Response `200`

Batch processed. Inspect `failed` for per-post errors.

- object
  - `data` object
    - `action` 'publish' | 'unpublish' | 'delete'
    - `succeeded` string[]
    - `failed` object[]
      - `id` string, uuid
      - `code` string: Machine-readable failure reason, e.g. not_found, rules_blocked, site_feature_disabled, unknown.
      - `error` string: Human-readable, sanitized message.
      - `retry_with_force` boolean: True when the failure is a rules_blocked refusal carrying warning-severity content-rule violations only; retrying the identical call with force: true will publish.
    - `counts` object
      - `requested` integer: Size of the deduplicated id set.
      - `succeeded` integer
      - `failed` integer

## Other responses

- `400`: Validation failed
- `401`: Authentication failed
- `403`: Forbidden - action not allowed on this resource
- `429`: Rate limit exceeded

---

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