Schedule API

Program schedules for RadioMV main stations including show times, categories, and descriptions.

Endpoints

GET /english-programv2.json
GET /slavic-programv2.json
GET /spanish-programv2.json
GET /german-programv2.json

Response Format

{
    "schemaVersion": "2.0.0",
    "lastUpdated": "2024-12-19",
    "station": {
        "id": 1,
        "name": "English",
        "language": "en",
        "timezone": "America/Los_Angeles"
    },
    "schedule": [
        {
            "id": "1-001",
            "name": "Kids Hour",
            "description": "An hour-long children's program.",
            "category": "children",
            "days": [0, 1, 2, 3, 4, 5, 6],
            "startTime": "07:00",
            "endTime": "08:00"
        }
    ]
}

Root Fields

schemaVersion string required
Semantic version of the schema format. Check this for compatibility.
lastUpdated string required
ISO 8601 date when schedule content was last modified (e.g., "2024-12-19").
station object required
Station metadata object.
schedule array required
Array of program schedule items.

Station Object

id number required
Unique station identifier. Matches IDs in appv1.json.
name string required
Station display name.
language string required
ISO 639-1 language code: en, es, de, ru
timezone string required
IANA timezone identifier. All times in schedule are in this timezone.

Schedule Item Object

id string required
Unique identifier in format {stationId}-{sequence} (e.g., "1-001").
name string required
Program name in the station's language.
description string required
Program description. May be empty string.
category string required
Standardized category for filtering. See Categories.
days number[] required
Array of day numbers (0-6). See Days of Week.
startTime string required
Start time in 24-hour format HH:MM.
endTime string required
End time in 24-hour format HH:MM.

Days of Week

Days are represented as numbers following JavaScript's Date.getDay() convention:

Number Day
0Sunday
1Monday
2Tuesday
3Wednesday
4Thursday
5Friday
6Saturday

Time Format

Times use 24-hour format (HH:MM) for consistent parsing:

12-Hour 24-Hour
12:00 AM00:00
7:00 AM07:00
12:00 PM12:00
1:00 PM13:00
6:30 PM18:30
11:00 PM23:00
Timezone All times are in the station's local timezone (specified in station.timezone). Currently all stations use America/Los_Angeles (Pacific Time).

Categories

Standardized categories enable filtering across all stations regardless of language:

Category Description
bible-readingScripture reading (OT, NT, Psalms, Proverbs)
bible-studyIn-depth Bible teaching/study programs
sermonPreaching/sermons from pastors
testimonyPersonal testimonies
musicMusic programs
childrenChildren's programming
familyFamily-focused content
liveLive broadcasts, call-in shows
missionaryMissionary reports and updates
educationalEducational/science programs
audiobookAudiobook readings
devotionalDaily devotional content
talk-showDiscussion/interview programs

Code Examples

Get Current Program

function getCurrentProgram(schedule) {
    const now = new Date();
    const currentDay = now.getDay();
    const currentTime = now.toTimeString().slice(0, 5); // "HH:MM"

    return schedule.find(item =>
        item.days.includes(currentDay) &&
        item.startTime <= currentTime &&
        item.endTime > currentTime
    );
}

Get Today's Schedule

function getTodaySchedule(schedule) {
    const today = new Date().getDay();
    return schedule
        .filter(item => item.days.includes(today))
        .sort((a, b) => a.startTime.localeCompare(b.startTime));
}

Filter by Category

function getProgramsByCategory(schedule, category) {
    return schedule.filter(item => item.category === category);
}

// Get all sermons
const sermons = getProgramsByCategory(schedule, 'sermon');

Check for Updates

function isScheduleStale(data, maxAgeDays = 30) {
    const lastUpdated = new Date(data.lastUpdated);
    const now = new Date();
    const diffDays = (now - lastUpdated) / (1000 * 60 * 60 * 24);
    return diffDays > maxAgeDays;
}

Swift Example

func getScheduleForDay(_ schedule: [ScheduleItem], day: Int) -> [ScheduleItem] {
    return schedule
        .filter { $0.days.contains(day) }
        .sorted { $0.startTime < $1.startTime }
}

Kotlin Example

fun getProgramsByCategory(
    schedule: List<ScheduleItem>,
    category: String
): List<ScheduleItem> {
    return schedule.filter { it.category == category }
}