---
title: "Refresh a published RSS episode enclosure from its source artifact."
method: POST
path: "/publishing-releases/{releaseId}/refresh-media"
tags: ["Publishing"]
---

# Refresh a published RSS episode enclosure from its source artifact.

`POST /publishing-releases/{releaseId}/refresh-media`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/publishing-releases/{releaseId}/refresh-media`
- Auth: HTTP bearer

Explicit RSS repair operation for a published audio episode whose SAME table-read source artifact was re-finalized. Rebinds the existing MP3 asset and published RSS target to the artifact's latest finalized media while preserving release id, episode number, metadata, publish timestamps, and published status. Direct-provider targets are not changed because this operation does not republish to those providers. It rejects a different source artifact, non-audio releases, and media that is not ready.

## Headers

- `Idempotency-Key` string, required

## Request body

- PublishingReleaseRefreshMediaRequest: Explicitly rebind an already-published release to the latest finalized media from its existing source artifact.
  - `sourceArtifactId` string, required: Must exactly match the sourceArtifactId already bound to the published release.

## Response `200`

Publishing release envelope.

- PublishingReleaseEnvelope
  - `release` PublishingRelease, required
    - `id` string, required
    - `seriesId` string, required
    - `projectId` string, required
    - `seriesBibleDocumentId` string, nullable
    - `storyPlanId` string, nullable
    - `storyJobId` string, nullable
    - `sourceArtifactId` string, nullable
    - `type` 'episode' | 'trailer' | 'bonus' | 'clip' | 'announcement', required
    - `medium` 'audio' | 'video' | 'short_form' | 'text' | 'mixed', required
    - `status` 'ready' | 'scheduled' | 'publishing' | 'published' | 'failed' | 'canceled' | 'stale', required
    - `title` string, required: The stored title.
    - `label` string: The name the release is listed by everywhere: an episode's season and number with its title ("S1E1 — The Return"), any other release's title. Display only.
    - `subtitle` string, nullable
    - `description` string, nullable
    - `seasonNumber` integer, nullable
    - `episodeNumber` integer, nullable
    - `scheduledAt` string, date-time, nullable
    - `publishedAt` string, date-time, nullable
    - `publishedVia` 'user_confirmed' | 'standing_approval' | 'owner' | 'season_run', nullable: Who let the release into the feed: a person's `userConfirmed`, the show's standing approval (published unasked), the owner in the app, or a season run's confirmed step. Written by a publish, or by `POST /publishing-releases/{releaseId}/schedule`; null until one of those.
    - `publishedByKeyId` string, nullable: The Story API key that published or scheduled it — under a standing approval, the bound key; null in the app and for the built-in runner.
    - `sourceFingerprint` string, nullable
    - `staleReason` string, nullable
    - `assets` PublishingReleaseAsset[]
      - `id` string, required
      - `releaseId` string, required
      - `sourceArtifactId` string, nullable
      - `kind` 'mp3' | 'mp4' | 'wav' | 'm4a' | 'mov' | 'captions' | 'transcript' | 'cover_art' | 'image' | 'manifest', required
      - `status` 'ready' | 'stale' | 'failed', required
      - `url` string, uri, nullable
      - `mimeType` string, nullable
      - `durationMs` integer, nullable
      - `byteSize` integer, nullable
      - `checksum` string, nullable
      - `sourceFingerprint` string, nullable
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `targets` PublishingReleaseTarget[]
      - `id` string, required
      - `releaseId` string, required
      - `destinationId` string, required
      - `provider` 'rss' | 'apple_podcasts' | 'spotify' | 'youtube' | 'tiktok' | 'instagram' | 'linkedin' | 'x' | 'other', required
      - `medium` 'audio' | 'video' | 'short_form' | 'text' | 'mixed', required
      - `status` 'pending' | 'queued' | 'publishing' | 'published' | 'failed' | 'skipped' | 'needs_setup' | 'stale', required
      - `visibility` 'public' | 'unlisted' | 'private' | 'draft', required
      - `externalId` string, nullable
      - `externalUrl` string, uri, nullable
      - `publishedAt` string, date-time, nullable
      - `attempts` integer, required
      - `sourceFingerprint` string, nullable
      - `destination` PublishingDestination
        - `id` string, required
        - `seriesId` string, required
        - `projectId` string, required
        - `provider` 'rss' | 'apple_podcasts' | 'spotify' | 'youtube' | 'tiktok' | 'instagram' | 'linkedin' | 'x' | 'other', required
        - `medium` 'audio' | 'video' | 'short_form' | 'text' | 'mixed', required
        - `key` string, required
        - `label` string, nullable
        - `status` 'draft' | 'connected' | 'needs_auth' | 'needs_setup' | 'disconnected' | 'failed' | 'archived', required
        - `providerAccountId` string, nullable
        - `providerConfigId` string, nullable
        - `scopes` string[]
        - `settings` unknown
        - `externalUrl` string, uri, nullable
        - `lastVerifiedAt` string, date-time, nullable
        - `createdAt` string, date-time, required
        - `updatedAt` string, date-time, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required

## 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.
- `409`: The promoted source artifact does not have the required finalized durable asset yet. Finalize the artifact first, then promote or publish.
- `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)
