---
title: "Generate podcast cover art for a series."
method: POST
path: "/publishing-series/{seriesId}/generate-cover-art"
tags: ["Publishing"]
---

# Generate podcast cover art for a series.

`POST /publishing-series/{seriesId}/generate-cover-art`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/publishing-series/{seriesId}/generate-cover-art`
- Auth: HTTP bearer

Generates a 1536×1536 square podcast cover image from the series context (title, description, genre). The image is stored durably on R2 and the URL is returned. The URL is NOT automatically saved to the series — call PATCH /publishing-series/{seriesId} with `coverArtUrl` to persist it. Optional request body fields override the stored series values for this generation only, allowing callers to preview art from unsaved draft context.

## Request body

- PublishingCoverArtGenerateRequest: Optional context overrides for cover-art generation. When omitted the server reads the stored series values. Lengths mirror series field limits to prevent prompt abuse.
  - `title` string: Override the series title for this generation.
  - `description` string, nullable: Override the series description. Null treats it as blank.
  - `podcastCategory` string, nullable: Override the podcast category. Null treats it as blank.
  - `podcastSubcategory` string, nullable: Override the podcast subcategory. Null treats it as blank.

## Response `200`

Durable cover art URL.

- PublishingCoverArtGenerateResponse
  - `coverArtUrl` string, uri, required: Durable R2 URL of the generated cover image. Persist it with PATCH /publishing-series/{seriesId}.
  - `realPeopleOmitted` string[]: Present when the cover would have shown real, identifiable people whose likeness needs approval: their names. The cover was drawn without them, or (when it still would have shown them) `coverArtUrl` is the show's current cover. Never an error: a show is never held for its cover.
  - `note` string, nullable: What happened, in a sentence, when `realPeopleOmitted` is present.

## Other responses

- `400`: Request payload failed validation. The error message names the offending field.
- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: The publishing series, destination, or release does not exist or is owned by another account.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/4534f5d25540?raw)
