> ## Documentation Index
> Fetch the complete documentation index at: https://snowseo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk article actions

> Preview, publish, unpublish, unschedule, or delete many articles at once.

Every bulk action takes a `selection` and works through it in batches:

* `selection` is either `{ mode: "ids", ids: [articleSlug, ...] }` or `{ mode: "all", filters: { search? }, excludedIds: [...] }` (every article matching the filters, minus the excluded slugs).
* Call `POST /v3/cms/articles/bulk-preview` with the `selection` and an `action` first. It changes nothing and returns `eligibility`: `{ selected, eligible, skipped, byReason }`, e.g. articles skipped because they are not generated yet.

| Action | Endpoint | Rows per call | Extra body |
| - | - | - | - |
| Publish | `POST /v3/cms/articles/bulk-publish` | 10 | `provider` (required), `status` (`draft` or `publish`) |
| Unpublish | `POST /v3/cms/articles/bulk-unpublish` | 10 | none; each article is removed from the CMS it was published to |
| Unschedule | `POST /v3/cms/articles/bulk-unschedule` | 50 | none |
| Delete | `POST /v3/cms/articles/bulk-delete` | 50 | none; permanent, and does not remove CMS copies |

Each call processes one batch of eligible articles and returns `{ success, succeeded, failed, nextCursor, eligibility, results }`. While `nextCursor` is not `null`, call again with the same `selection` and `afterId` set to `nextCursor`. `results` has one entry per article with `id`, `articleSlug`, `success` and `error` when it failed.

For a single article, use [Publish](https://snowseo.com/docs/api-reference/endpoints/publish-article.md), [Unpublish](https://snowseo.com/docs/api-reference/endpoints/publish-article-unpublish.md), [Unschedule](https://snowseo.com/docs/api-reference/endpoints/publish-article-unschedule.md) or delete by slug.


## OpenAPI

````yaml POST /v3/cms/articles/bulk-preview
openapi: 3.0.0
info:
  title: SnowSEO API
  description: API documentation for SnowSEO
  version: 1.0.0
servers:
  - url: https://api.snowseo.com
    description: Production server
security:
  - bearerAuth: []
  - apiKey: []
externalDocs:
  url: https://snowseo.com/docs
  description: Find more info here
paths:
  /v3/cms/articles/bulk-preview:
    post:
      tags:
        - CMS
      summary: Count which selected articles a bulk action applies to
      description: >-
        Read-only. For a selection of articles (explicit slugs, or all matching
        a search minus exclusions), reports how many the given bulk action would
        change and why the rest would be skipped. Call it before a bulk action
        and confirm the counts with the user.
      operationId: articlesBulkPreview
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - selection
                - action
              properties:
                teamId:
                  type: string
                selection:
                  oneOf:
                    - type: object
                      required:
                        - mode
                        - ids
                      additionalProperties: false
                      properties:
                        mode:
                          type: string
                          enum:
                            - ids
                        ids:
                          type: array
                          items:
                            type: string
                    - type: object
                      required:
                        - mode
                        - filters
                        - excludedIds
                      additionalProperties: false
                      properties:
                        mode:
                          type: string
                          enum:
                            - all
                        filters:
                          type: object
                          properties:
                            search:
                              type: string
                          additionalProperties: false
                        excludedIds:
                          type: array
                          items:
                            type: string
                action:
                  type: string
                  enum:
                    - publish
                    - unpublish
                    - unschedule
                    - delete
                  description: The bulk action to count eligible rows for.
                provider:
                  type: string
                  enum:
                    - wordpress
                    - shopify
                    - webflow
                    - ghost
                    - webhook
                    - framer
                    - grigora
                    - snowcms
                    - embed
                  description: Connected CMS to publish to.
                status:
                  type: string
                  enum:
                    - draft
                    - publish
                  description: Post status on the CMS. Defaults to publish.
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  eligibility:
                    type: object
                    required:
                      - selected
                      - eligible
                      - skipped
                      - byReason
                    properties:
                      selected:
                        type: number
                      eligible:
                        type: number
                      skipped:
                        type: number
                      byReason:
                        type: object
                        additionalProperties:
                          type: number
        '500':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
                properties:
                  success:
                    type: boolean
                  error:
                    type: string
                  code:
                    type: string
                  message:
                    type: string
                  reference:
                    type: string
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Your SnowSEO API key (sk_...).
    apiKey:
      type: apiKey
      name: x-api-key
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.