GET /api/podcast/{id}
Returns podcast details and host information for a specific podcast using the Podcast Index Feed ID. Includes both podcast-level hosts and any Podcast 2.0 person tags from the feed.
GET /api/podcast/{id}/episodes
Returns episodes for a specific podcast, including guest information and episode-level person data from Podcast 2.0 feeds. Supports optional limit
parameter (default: 20, max: 100).
GET /api/hosts/{id}
Returns detailed information about hosts associated with a podcast.
GET /api/download-database
Downloads the entire SQLite database for offline use.
GET /api/public-dataset
Downloads a JSON export of all public data including hosts, podcasts, episodes, and guest relationships.
GET /api/recent-hosts
Returns recently added hosts.
GET /api/search-podcasts?query={term}
Search for podcasts by name.
GET /api/stats
Returns database statistics.
GET /api/popular-podcasts
Returns popular podcasts based on host count.
The SQLite database includes the following main tables:
-- Hosts and Guests
CREATE TABLE hosts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
description TEXT,
link TEXT,
img TEXT,
created_at DATETIME
);
-- Podcast-Host relationships
CREATE TABLE host_podcasts (
host_id INTEGER,
podcast_id INTEGER,
role TEXT,
status TEXT,
created_at DATETIME
);
-- Episodes
CREATE TABLE episodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
podcast_id INTEGER,
title TEXT,
description TEXT,
audio_url TEXT UNIQUE,
pub_date DATETIME,
duration INTEGER,
season_number INTEGER,
episode_number INTEGER,
image_url TEXT,
link TEXT,
guid TEXT,
status TEXT,
created_at DATETIME
);
-- Episode-Guest relationships
CREATE TABLE episode_guests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_id INTEGER,
host_id INTEGER,
role TEXT,
status TEXT,
approval_key TEXT,
approval_key_expires_at DATETIME,
created_at DATETIME
);
// Get podcast information including hosts
async function getPodcastHosts(podcastId) {
const response = await fetch(`https://podpeople.db/api/podcast/${podcastId}`);
const data = await response.json();
return data.hosts; // Array of hosts from Podcast 2.0 or database
}
// Get episodes with guest information
async function getEpisodesWithGuests(podcastId, limit = 20) {
const response = await fetch(`https://podpeople.db/api/podcast/${podcastId}/episodes?limit=${limit}`);
const episodes = await response.json();
// Each episode includes:
// - episode.guests: array of approved guests
// - episode.can_add_guests: boolean if submissions allowed
// - episode.guest_count: number of guests
return episodes;
}
// Generate episode page URLs for guest submissions
function getEpisodePageUrl(podcastId, audioUrl) {
const encodedAudioUrl = encodeURIComponent(audioUrl);
return `https://podpeople.db/episode/${podcastId}/${encodedAudioUrl}`;
}
// Example: Create a "Submit Guest" button
function createSubmitGuestButton(episode, podcastId) {
if (!episode.can_add_guests) return null; // No submissions allowed
const button = document.createElement('a');
button.href = getEpisodePageUrl(podcastId, episode.audio_url);
button.textContent = 'Submit Guest Information';
button.target = '_blank';
return button;
}
// Complete integration example
async function displayPodcastWithEpisodes(podcastId) {
try {
// Get podcast info
const podcastResponse = await fetch(`https://podpeople.db/api/podcast/${podcastId}`);
const podcast = await podcastResponse.json();
// Get episodes
const episodesResponse = await fetch(`https://podpeople.db/api/podcast/${podcastId}/episodes`);
const episodes = await episodesResponse.json();
// Display podcast hosts
console.log('Podcast Hosts:', podcast.hosts);
// Display episodes with guests
episodes.forEach(episode => {
console.log(`Episode: ${episode.title}`);
console.log(`Guests:`, episode.guests);
if (episode.can_add_guests) {
const episodeUrl = getEpisodePageUrl(podcastId, episode.audio_url);
console.log(`Guest submission URL: ${episodeUrl}`);
}
});
} catch (error) {
console.error('Error fetching data:', error);
}
}
PodPeopleDB supports episode-level guest tracking with the following features:
podcast:person
tags are automatically parsed and displayedFor podcasts without Podcast 2.0 tags, users can submit episode guests:
https://podpeople.db/episode/{podcastId}/{encodedAudioUrl}
// Podcast page (hosts and episodes list)
https://podpeople.db/podcast/{podcastId}
// Episode page (episode details and guests)
https://podpeople.db/episode/{podcastId}/{encodedAudioUrl}
// Example episode URL
https://podpeople.db/episode/123456/https%3A%2F%2Fexample.com%2Fepisode.mp3
Currently, there are no rate limits in place, but please be considerate with your API usage.