---
title: "Podcast Download Redirect"
method: GET
path: "/v1/podcasts/dl"
---

# Podcast Download Redirect

`GET /v1/podcasts/dl`

## Request

- Base URL: `https://api.storyflo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.storyflo.com/v1/podcasts/dl`
- Auth: none declared

Download-tracking redirect for podcast ``<enclosure>`` URLs — the
attribution seam for Apple/Spotify/Overcast plays.

Podcast apps GET this endpoint (it's the enclosure URL), we record the
download, then 302 to the real audio host (the app follows it and still
counts the download). Emits a structured ``podcast_download`` log line
keyed by episode + privacy-safe IP hash so listens are countable (dedupe
by (key, ip) for IAB-style unique downloads — analytics fast-follow).

HEAD is registered alongside GET (2026-07-15 incident): YouTube/Apple
HEAD-probe enclosure URLs before ingesting; a 405 reads as "could not
fetch the audio file" and the episode is rejected. HEAD returns the
identical 302 + Location (the redirect target — audio.storyflo.com
CloudFront — itself serves HEAD, verified 200 audio/mpeg) but does NOT
emit the ``podcast_download`` line: a probe is not a listen.

Open-redirect-guarded: only ``*.r2.dev`` / ``*.storyflo.com`` audio
hosts are honored; anything else is a 400.

## Query parameters

- `u` string, required

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/storyflo/apis/storyflo-inference-router.md) · [All operations](https://skmtc.dev/storyflo/apis/storyflo-inference-router/llms.txt) · [OpenAPI document](https://skmtc.dev/storyflo/apis/storyflo-inference-router/revisions/c3a1a735ac7a?raw)
