Authentication
All API requests require a Bearer token in the Authorization header.
Create API keys from your
account settings.
Authorization: Bearer fire_your_token_here
Tokens use the fire_ prefix followed by 64 hex characters.
The raw token is shown once at creation — store it securely.
If a token is lost, revoke it and create a new one.
Each key is either Read Only (the default) or Read/Write,
chosen when you create it. Read Only keys can use every endpoint on this page. Endpoints
that make changes need a Read/Write key, and are still limited to what your role on the
podcast allows. Current User reports a key’s access as
read_only or read_and_write.
Invalid or missing tokens return 401 Unauthorized:
{
"error": {
"message": "Invalid or missing API token",
"code": "unauthorized"
}
}
Base URL
All endpoints are under the /api/v1/ namespace:
https://fireside.fm/api/v1/
All responses are JSON. Endpoints return appropriate HTTP status codes:
200— Success401— Invalid or missing token403— Your role or plan doesn’t allow this (same rules as the Fireside dashboard)404— Resource not found (or not accessible to your account)429— Rate limit exceeded
Rate Limiting
API requests are limited to 120 requests per minute per API token, or per IP address for unauthenticated requests. Every response includes rate limit headers:
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests per minute |
X-RateLimit-Remaining |
Requests remaining in the current window |
Retry-After |
Seconds to wait before retrying (only on 429 responses) |
When the limit is exceeded, the API returns 429 Too Many Requests:
{
"error": {
"message": "Rate limit exceeded.",
"code": "rate_limited"
}
}
Current User
GET /api/v1/me
Returns the account the token belongs to. Useful for checking that a token works.
Response
{
"data": {
"name": "Jane Doe",
"email": "[email protected]",
"created_at": "2024-01-15T12:00:00Z",
"api_token": {
"name": "My CLI",
"access": "read_only",
"created_at": "2026-09-01T12:00:00Z"
}
}
}
List Podcasts
GET /api/v1/podcasts
Returns all podcasts you own or collaborate on. Only complete, active podcasts are included. Results are paginated (50 per page).
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Page number |
per_page |
integer | 50 | Results per page, from 1 to 50. Ask for fewer to keep responses small. |
Response
{
"data": [
{
"token": "550e8400-e29b-41d4-a716-446655440000",
"title": "My Podcast",
"slug": "my-podcast",
"description": "A podcast about things.",
"subtitle": "Things and stuff",
"author_name": "Jane Doe",
"language": "en-us",
"explicit": false,
"artwork_url": "https://media24.fireside.fm/file/fireside-images-2024/podcasts/images/5/550e8400-e29b-41d4-a716-446655440000/cover.jpg?v=3",
"created_at": "2024-01-15T12:00:00Z",
"url": "https://my-podcast.fireside.fm",
"feed_url": "https://feeds.fireside.fm/my-podcast/rss",
"type": "episodic",
"categories": [{ "name": "Tech News", "parent": "Technology" }],
"copyright": "© 2026 My Podcast",
"donation_url": null,
"owner": { "name": "Jane Doe", "email": "[email protected]" }
}
],
"pagination": {
"page": 1,
"per_page": 50,
"max_per_page": 50,
"previous": null,
"next": 2
}
}
The podcast fields are the same as the
Get Podcast endpoint, except
total_downloads which is only available on the
show endpoint.
Get Podcast
GET /api/v1/podcasts/:podcast_token
Returns details for a single podcast, including total_downloads.
Response
{
"data": {
"token": "550e8400-e29b-41d4-a716-446655440000",
"title": "My Podcast",
"slug": "my-podcast",
"description": "A podcast about things.",
"subtitle": "Things and stuff",
"author_name": "Jane Doe",
"language": "en-us",
"explicit": false,
"artwork_url": "https://media24.fireside.fm/file/fireside-images-2024/podcasts/images/5/550e8400-e29b-41d4-a716-446655440000/cover.jpg?v=3",
"total_downloads": 50000,
"created_at": "2024-01-15T12:00:00Z",
"url": "https://my-podcast.fireside.fm",
"feed_url": "https://feeds.fireside.fm/my-podcast/rss",
"type": "episodic",
"categories": [{ "name": "Tech News", "parent": "Technology" }],
"copyright": "© 2026 My Podcast",
"donation_url": null,
"owner": { "name": "Jane Doe", "email": "[email protected]" }
}
}
| Field | Type | Description |
|---|---|---|
token |
string | Unique podcast identifier (UUID). Use this in other API calls. |
title |
string | Podcast title |
slug |
string | URL slug |
description |
string | Podcast description |
subtitle |
string or null | Podcast subtitle |
author_name |
string | Author name |
language |
string | Language code (e.g. "en-us") |
explicit |
boolean | Whether the podcast is marked explicit |
artwork_url |
string or null | The podcast’s cover artwork, the same URL as its RSS feed’s itunes:image |
total_downloads |
integer | All-time total downloads for the podcast (show endpoint only) |
created_at |
string | Creation timestamp (ISO 8601) |
url |
string | The podcast's website, as listed in its RSS feed (custom domain or external site when set) |
feed_url |
string | The podcast's public RSS feed |
type |
string | episodic or serial |
categories |
array | Apple Podcasts categories, each with its name and parent category (or null) |
copyright |
string | The copyright line from the RSS feed |
donation_url |
string or null | Donation link, when it's shown in the feed |
owner |
object | The feed's owner name and email |
List Episodes
GET /api/v1/podcasts/:podcast_token/episodes
Returns every episode of a podcast, including drafts and scheduled episodes, ordered by publish date (newest first). Results are paginated (100 per page). Requires the owner, manager, or producer role, the same as the episode pages in the Fireside dashboard.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
status |
string | all | One of published, scheduled, or draft |
page |
integer | 1 | Page number |
per_page |
integer | 100 | Results per page, from 1 to 100. Ask for fewer to keep responses small. |
Response
{
"data": [
{
"token": "6a20c700-51d3-4c0a-abe7-da88d972a27c",
"title": "Alternating Currents",
"subtitle": "Tesla vs. Edison",
"slug": "42",
"season": 2,
"episode_type": "full",
"status": "published",
"visibility": "public",
"members_only": false,
"explicit": false,
"duration": 3120,
"published_at": "2026-09-10T23:14:54Z",
"created_at": "2026-09-01T12:00:00Z",
"updated_at": "2026-09-10T23:14:54Z",
"url": "https://my-podcast.fireside.fm/42",
"preview_url": "https://my-podcast.fireside.fm/preview/x7Kq2mPa",
"audio_url": "https://aphid.fireside.fm/d/1437767933/550e8400-e29b-41d4-a716-446655440000/6a20c700-51d3-4c0a-abe7-da88d972a27c.mp3",
"audio_size": 49920000,
"guid": "6a20c700-51d3-4c0a-abe7-da88d972a27c",
"artwork_url": "https://media24.fireside.fm/file/fireside-images-2024/podcasts/images/5/550e8400-e29b-41d4-a716-446655440000/cover.jpg?v=3",
"transcript_url": "https://media24.fireside.fm/file/fireside-images-2024/podcasts/transcripts/5/550e8400-e29b-41d4-a716-446655440000/episodes/6/6a20c700-51d3-4c0a-abe7-da88d972a27c/transcript.txt",
"chapters_url": "https://feeds.fireside.fm/my-podcast/json/episodes/6a20c700-51d3-4c0a-abe7-da88d972a27c/chapters",
"player_url": "https://fireside.fm/player/v2/AbCd1234+EfGh5678",
"player_embed_code": "<iframe src=\"https://fireside.fm/player/v2/AbCd1234+EfGh5678\" width=\"740\" height=\"200\" frameborder=\"0\" scrolling=\"no\"></iframe>",
"soundbite": { "title": "The best bit", "start_time": 90, "duration": 30 },
"hosts": [{ "name": "Jane Doe", "url": "https://janedoe.example.com" }],
"guests": [{ "name": "Sam Lee", "url": null }]
}
],
"pagination": {
"page": 1,
"per_page": 100,
"max_per_page": 100,
"previous": null,
"next": null
}
}
| Field | Type | Description |
|---|---|---|
status |
string | published, scheduled, or draft. An episode is a draft until it has audio, a publish date, and isn’t private. |
visibility |
string | public, unlisted, or private |
slug |
string | URL slug. For numbered episodes this is the episode number. |
duration |
integer or null | Length in seconds |
published_at |
string or null | Publish date (ISO 8601). In the future for scheduled episodes; null for drafts with no date. |
url |
string or null | Public episode page. Only set for published episodes. |
preview_url |
string |
Private preview page, available in every state, including drafts.
Anyone with this link can see and play the episode without logging in,
so share it only with people you’d show an unreleased episode to.
Use url for public links.
|
audio_url |
string or null | The audio file URL used in your RSS feed. Only set once audio is uploaded. |
audio_size |
integer or null | Audio file size in bytes |
guid |
string | The episode's RSS GUID, which podcast apps use to identify it (the original GUID for imported episodes) |
artwork_url |
string | The episode's artwork, or the podcast's when the episode has none, as in the feed |
transcript_url |
string or null | Plain-text transcript, when one is uploaded |
chapters_url |
string or null | Chapters JSON (Podcasting 2.0 format), when the episode has chapters |
player_url |
string | The embeddable web player for this episode |
player_embed_code |
string | HTML for embedding that player |
soundbite |
object or null | A highlight clip: title, start_time and duration in seconds |
hosts, guests |
array | The hosts and guests shown on the episode’s page, each with a name and url (or null). People hidden from your site are left out. Hosts are in the order you set; guests are alphabetical. |
Get Episode
GET /api/v1/podcasts/:podcast_token/episodes/:episode_token
Returns a single episode with the same fields as
List Episodes, plus description (the show notes).
Episode Metrics
GET /api/v1/podcasts/:podcast_token/metrics/episodes
Per-episode download statistics for all published episodes,
ordered by publish date (newest first). Results are paginated (100 per page).
Each episode has the same fields as List Episodes,
plus downloads.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Page number |
per_page |
integer | 100 | Results per page, from 1 to 100. Ask for fewer to keep responses small. |
Response
{
"data": [
{
"token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Episode Title",
"subtitle": null,
"slug": "episode-slug",
"season": 2,
"episode_type": "full",
"status": "published",
"visibility": "public",
"members_only": false,
"explicit": false,
"duration": 1830,
"published_at": "2026-03-01T05:00:00Z",
"created_at": "2026-02-20T12:00:00Z",
"updated_at": "2026-03-01T05:00:00Z",
"url": "https://mypodcast.fireside.fm/episode-slug",
"preview_url": "https://mypodcast.fireside.fm/preview/x7Kq2mPa",
"audio_url": "https://aphid.fireside.fm/d/1437767933/550e8400-e29b-41d4-a716-446655440000/a1b2c3d4-e5f6-7890-abcd-ef1234567890.mp3",
"audio_size": 29280000,
"downloads": {
"1_day": 500,
"7_day": 1200,
"14_day": 1800,
"30_day": 2500,
"90_day": 4000,
"spotify": 300,
"total": 5000
}
}
],
"pagination": {
"page": 1,
"per_page": 100,
"max_per_page": 100,
"previous": null,
"next": 2
}
}
| Field | Type | Description |
|---|---|---|
| Episode fields | The same fields as List Episodes | |
downloads.1_day |
integer or null | Downloads within 1 day of publish. null if not enough time has passed. |
downloads.7_day |
integer or null | Downloads within 7 days of publish |
downloads.14_day |
integer or null | Downloads within 14 days of publish |
downloads.30_day |
integer or null | Downloads within 30 days of publish |
downloads.90_day |
integer or null | Downloads within 90 days of publish |
downloads.spotify |
integer | Total Spotify streams, or 0 when the podcast has none. Already counted inside downloads.total. |
downloads.total |
integer | All-time total downloads for this episode, including any Spotify streams |
pagination.page |
integer | Current page number |
pagination.per_page |
integer | Results per page |
pagination.max_per_page |
integer | The most per_page can be for this endpoint |
pagination.previous |
integer or null | Previous page number, or null if on the first page |
pagination.next |
integer or null | Next page number, or null if on the last page |
Downloads by Month
GET /api/v1/podcasts/:podcast_token/metrics/downloads
Monthly download totals for the podcast, in reverse chronological order. Results are paginated (36 per page).
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 | Page number |
per_page |
integer | 36 | Results per page, from 1 to 36. Ask for fewer to keep responses small. |
Response
{
"data": [
{ "date": "2026-03-01", "value": 1500 },
{ "date": "2026-02-01", "value": 1200 }
],
"meta": {
"total_downloads": 50000
},
"pagination": {
"page": 1,
"per_page": 36,
"max_per_page": 36,
"previous": null,
"next": 2
}
}
| Field | Type | Description |
|---|---|---|
data[].date |
string | First day of the period (YYYY-MM-DD) |
data[].value |
integer | Total downloads for that period |
meta.total_downloads |
integer | All-time total downloads for the podcast |
pagination.page |
integer | Current page number |
pagination.per_page |
integer | Results per page |
pagination.max_per_page |
integer | The most per_page can be for this endpoint |
pagination.previous |
integer or null | Previous page number, or null if on the first page |
pagination.next |
integer or null | Next page number, or null if on the last page |
Quick Start
1. Create an API key from your API Keys page.
2. List your podcasts:
curl -H "Authorization: Bearer fire_your_token" \
https://fireside.fm/api/v1/podcasts
3. Get episode metrics using a podcast token from the response:
curl -H "Authorization: Bearer fire_your_token" \
https://fireside.fm/api/v1/podcasts/PODCAST_TOKEN/metrics/episodes
4. Get monthly downloads:
curl -H "Authorization: Bearer fire_your_token" \
https://fireside.fm/api/v1/podcasts/PODCAST_TOKEN/metrics/downloads