Host podcasts on Fountain: manage feeds and items. A feed/item is the internal representation of a public show/episode.
List every feed you can access.
200Your feeds.The feeds you host.
curl -X GET "https://api.fountain.fm/v1/feeds" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"feeds": [
{
"id": "a1b2c3d4",
"fountain_id": "show:id:def456",
"title": "Citadel Dispatch",
"author": "ODELL",
"description": "Freedom tech and Bitcoin, live and unedited.",
"categories": [
"Technology",
"News"
],
"explicit": false,
"display_email": false,
"links": [
"https://citadeldispatch.com"
],
"image": "https://media.fountain.fm/shows/a1b2c3d4/cover.jpg",
"vocabulary": [
"Nostr",
"sats"
],
"rss_url": "https://feeds.fountain.fm/a1b2c3d4",
"updated": "2026-02-18T22:03:53.467Z"
}
]
}Load a single feed by ID.
feed_idstringrequiredThe feed to read.
200The feed.The feed.
curl -X GET "https://api.fountain.fm/v1/feeds/{feed_id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"feed": {
"id": "a1b2c3d4",
"fountain_id": "show:id:def456",
"title": "Citadel Dispatch",
"author": "ODELL",
"description": "Freedom tech and Bitcoin, live and unedited.",
"categories": [
"Technology",
"News"
],
"explicit": false,
"display_email": false,
"links": [
"https://citadeldispatch.com"
],
"image": "https://media.fountain.fm/shows/a1b2c3d4/cover.jpg",
"vocabulary": [
"Nostr",
"sats"
],
"rss_url": "https://feeds.fountain.fm/a1b2c3d4",
"updated": "2026-02-18T22:03:53.467Z"
}
}Edit a feed. The body is the patch: a value sets the field, null clears it, an absent key leaves it unchanged. image_id is a READY FEED_IMAGE upload (see Start Upload). On a published feed, a required field (title, author, description, image_id, categories) can't be cleared.
feed_idstringrequiredThe feed to edit.
Omitted fields stay unchanged. null clears a nullable field.
titlestring | nulloptionalFeed title.
authorstring | nulloptionalFeed author.
descriptionstring | nulloptionalFeed description in Markdown. Max 4000 characters when converted to HTML.
Apple Podcasts categories. Max 3.
explicitboolean | nulloptionalMark the feed as explicit.
display_emailboolean | nulloptionalShow the owner email in the feed.
linksstring[] | nulloptionalAssociated URLs. Max 3.
vocabularystring[] | nulloptionalTerms that help the AI transcriber. Max 224 tokens.
image_idstring | nulloptionalID of a READY FEED_IMAGE upload.
200The updated feed.The updated feed.
curl -X PATCH "https://api.fountain.fm/v1/feeds/{feed_id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Citadel Dispatch","categories":["Technology","News"],"explicit":false}'{
"title": "Citadel Dispatch",
"categories": [
"Technology",
"News"
],
"explicit": false
}{
"ok": true,
"feed": {
"id": "a1b2c3d4",
"fountain_id": "show:id:def456",
"title": "Citadel Dispatch",
"author": "ODELL",
"description": "Freedom tech and Bitcoin, live and unedited.",
"categories": [
"Technology",
"News"
],
"explicit": false,
"display_email": false,
"links": [
"https://citadeldispatch.com"
],
"image": "https://media.fountain.fm/shows/a1b2c3d4/cover.jpg",
"vocabulary": [
"Nostr",
"sats"
],
"rss_url": "https://feeds.fountain.fm/a1b2c3d4",
"updated": "2026-02-18T22:03:53.467Z"
}
}Read the download stats of a podcast, artist or album feed, plus payment stats once it is published. An artist’s downloads come from its albums. Unpublished feeds report downloads only. group_by dimensions differ in coverage: CONTENT and APP cover both downloads and payments, COUNTRY/KIND/PLATFORM are downloads-only (revenue and supporters 0), and ACTION/SUPPORTER are payments-only (downloads 0). Under CONTENT each group.content is a hosting item id, or an album feed id for an artist. Rows from deleted items and livestreams are omitted from the breakdown but still counted in the feed totals.
feed_idstringrequiredThe feed to read stats for.
startstringoptionalISO-8601 inclusive range start; also enables the previous comparison window.
endstringoptionalISO-8601 inclusive range end.
bucketstringoptionalBucket size for the buckets time series: DAY, WEEK or MONTH. Omit for totals only.
group_bystringoptionalComma-separated breakdown dimensions: CONTENT, COUNTRY, KIND, PLATFORM, APP, ACTION, SUPPORTER.
200The feed stats.The feed stats.
curl -X GET "https://api.fountain.fm/v1/feeds/{feed_id}/stats" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"stats": {
"rows": [
{
"group": {},
"total": {
"downloads": 1240,
"revenue_usd": 32.5,
"revenue_satoshis": 48210,
"supporters": 18
},
"previous": {
"downloads": 980,
"revenue_usd": 24,
"revenue_satoshis": 35600,
"supporters": 14
}
}
],
"meta": {}
}
}List a feed's items, newest first, up to 100 per page. Pass the returned next_cursor back as ?cursor= for the next page; when it is absent, you have reached the last page.
feed_idstringrequiredThe feed whose items to list.
cursorstringoptionalA next_cursor from a previous page. Omit for the first page.
200A page of items.The items.
next_cursorstringoptionalPass back as ?cursor= for the next page. Absent on the last page.
curl -X GET "https://api.fountain.fm/v1/feeds/{feed_id}/items" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"items": [
{
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "PUBLISHED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
],
"next_cursor": "eyJpZCI6ImU1ZjZnN2g4In0"
}Create a DRAFT item. All fields are updated later via Update Item.
feed_idstringrequiredThe feed to add the item to.
200The new draft item.The new item.
curl -X POST "https://api.fountain.fm/v1/feeds/{feed_id}/items" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"item": {
"id": "e5f6g7h8",
"status": "DRAFT",
"updated": "2026-02-18T22:03:53.467Z"
}
}Load a single item by ID.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to read.
200The item.The item.
curl -X GET "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"item": {
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "PUBLISHED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
}Edit an item. The body is the patch: a value sets the field, null clears it, an absent key leaves it unchanged. The *_id fields attach READY uploads of the matching type: a *_paid_id upload must have been created with access: "PAID", a *_default_id with access: "DEFAULT". Attaching a video also uses its extracted audio for the same slot unless that slot's audio is already set. Enabling any paid feature needs audio_paid_id and prices a one-time product at price_usd_cents (defaults to 100 on first enable). The monetization variant is locked once the item is PUBLISHED, and a published item's required media can't be cleared.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to edit.
Omitted fields stay unchanged. null clears a nullable field.
titlestringoptionalItem title.
descriptionstring | nulloptionalItem description in Markdown. Max 10000 characters when converted to HTML.
season_numbernumber | nulloptionalSeason number.
item_numbernumber | nulloptionalItem number within the season.
linksstring[] | nulloptionalAssociated URLs. Max 3.
explicitboolean | nulloptionalMark the item as explicit.
audio_default_idstring | nulloptionalID of a READY ITEM_AUDIO upload for the free audio.
audio_paid_idstring | nulloptionalID of a READY ITEM_AUDIO upload for the paid audio.
video_default_idstring | nulloptionalID of a READY ITEM_VIDEO upload for the free video.
video_paid_idstring | nulloptionalID of a READY ITEM_VIDEO upload for the paid video.
image_idstring | nulloptionalID of a READY ITEM_IMAGE upload.
bonusbooleanoptionalMake the item subscriber-only. Cannot change after publishing.
adfreebooleanoptionalOffer a paid ad-free version. Not for bonus items.
early_accessbooleanoptionalOffer a paid early-access version. Not for bonus items.
early_access_daysnumberoptionalEarly-access window in days.
price_usd_centsnumberoptionalPrice of the paid version in USD cents.
200The updated item.The updated item.
curl -X PATCH "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"The Genesis Block","audio_default_id":"6f1a2b3c-4d5e-6f70-8901-23456789abcd"}'{
"title": "The Genesis Block",
"audio_default_id": "6f1a2b3c-4d5e-6f70-8901-23456789abcd"
}{
"ok": true,
"item": {
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "PUBLISHED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
}Soft-delete an item: its status becomes DELETED and it is removed from the feed.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to delete.
200The deleted item.The deleted item.
curl -X DELETE "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"item": {
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "DELETED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
}Publish an item immediately, from DRAFT or SCHEDULED: its status becomes PUBLISHED and the feed regenerates. Requires a title and default audio. No request body.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to publish.
200The published item.The published item.
curl -X POST "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}/publish" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"item": {
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "PUBLISHED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
}Schedule an item, from DRAFT or SCHEDULED: its status becomes SCHEDULED and it is released automatically at scheduled. Requires a title and default audio.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to schedule.
scheduledstringrequiredPublish time as a future ISO-8601 instant.
200The scheduled item.The scheduled item.
curl -X POST "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}/schedule" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scheduled":"2026-07-01T09:00:00Z"}'{
"scheduled": "2026-07-01T09:00:00Z"
}{
"ok": true,
"item": {
"id": "e5f6g7h8",
"fountain_id": "episode:id:abc123",
"title": "The Genesis Block",
"description": "We dig into the **first block** ever mined.",
"season_number": 2,
"item_number": 14,
"links": [
"https://citadeldispatch.com/cd141"
],
"explicit": false,
"status": "SCHEDULED",
"image": "https://media.fountain.fm/episodes/e5f6g7h8/cover.jpg",
"audio_default": "https://media.fountain.fm/episodes/e5f6g7h8/audio.mp3",
"bonus": false,
"adfree": false,
"early_access": false,
"published": "2026-02-18T22:03:53.467Z",
"updated": "2026-02-18T22:03:53.467Z"
}
}Read a single item’s stats, in the same shape and with the same params as Feed Stats, scoped to one item. It takes podcast and album feeds. An artist feed has no items and returns 404 ITEM_NOT_FOUND: read each album with Feed Stats. group_by=CONTENT is a per-item breakdown and is not valid here: it returns 400 BAD_REQUEST.
feed_idstringrequiredThe feed the item belongs to.
item_idstringrequiredThe item to read stats for.
startstringoptionalISO-8601 inclusive range start; also enables the previous comparison window.
endstringoptionalISO-8601 inclusive range end.
bucketstringoptionalBucket size for the buckets time series: DAY, WEEK or MONTH. Omit for totals only.
group_bystringoptionalComma-separated breakdown dimensions: COUNTRY, KIND, PLATFORM, APP, ACTION, SUPPORTER.
200The item stats.The item stats.
curl -X GET "https://api.fountain.fm/v1/feeds/{feed_id}/items/{item_id}/stats" \
-H "Authorization: Bearer $FOUNTAIN_API_KEY"{
"ok": true,
"stats": {
"rows": [
{
"group": {},
"total": {
"downloads": 1240,
"revenue_usd": 32.5,
"revenue_satoshis": 48210,
"supporters": 18
},
"previous": {
"downloads": 980,
"revenue_usd": 24,
"revenue_satoshis": 35600,
"supporters": 14
}
}
],
"meta": {}
}
}