App Configuration API

Station list, stream URLs, artwork, navigation links, and app settings.

Endpoints

GET /appv1.json

Legacy config for v1 apps. Points to old schedule URLs.

GET /appv2.json

New config for v2 apps. Points to v2 schedule URLs with improved schema.

Which version to use? New integrations should use appv2.json. The schedule URLs in appv2 point to the v2 schema with numeric days, 24-hour times, and categories.

Response Format

{
    "config": {
        "version": "20251212.1052",
        "logoLightMode": "https://assets.radiomv.studio/logo-light-mode.png",
        "logoDarkMode": "https://assets.radiomv.studio/logo-dark-mode.png"
    },
    "navigation": { ... },
    "settings": { ... },
    "stations": [ ... ]
}

Config Object

version string required
Date-based version in format YYYYMMDD.HHMM. Use for cache invalidation.
logoLightMode string required
URL to logo image for light mode backgrounds.
logoDarkMode string required
URL to logo image for dark mode backgrounds.

Contains navigation URLs organized by language group:

{
    "navigation": {
        "english": {
            "explore": {
                "url": "https://radiomv.com/support/#english"
            }
        },
        "spanish": { ... },
        "german": { ... },
        "slavic": { ... }
    }
}

Each language group contains:

explore.url string
URL to the explore/support page for that language.

Settings Object

Contact information and links organized by language group:

{
    "settings": {
        "english": {
            "website": "https://en.radiomv.com/",
            "office": "+1-830-208-2494",
            "sms": "+1-830-208-2494",
            "beta-program": "https://...",
            "report-a-bug": "https://..."
        }
    }
}
website string
Main website URL for the language.
office string
Office phone number.
sms string
SMS contact number.
beta-program string
URL to beta program signup.
report-a-bug string
URL to bug report form.

Stations Array

Array of all station objects. Each station contains:

{
    "id": "1",
    "station": "English",
    "language": "English",
    "isMain": true,
    "artworkUrl16x9": "https://assets.radiomv.studio/...",
    "artworkUrl1x1": "https://assets.radiomv.studio/...",
    "artworkUrlNowPlaying1x1": "https://assets.radiomv.studio/...",
    "audioPriority": "hls",
    "hlsStreamUrl": "https://stream.radiomv.com/english.m3u8",
    "iceStreamUrl": "https://stream.radiomv.com/english.m3u",
    "shareUrl": "https://player.radiomv.com/english.html",
    "stationScheduleUrl": "https://apps.radiomv.com/program/english-program.json",
    "metadataUrl": "https://api.radiomv.com/english.txt"
}

Station Fields

id string required
Unique station identifier (1-14).
station string required
Station display name.
language string required
Language group: "English", "Spanish", "German", or "Slavic".
isMain boolean required
Whether this is a main station (true) or auxiliary channel (false).
artworkUrl16x9 string optional
Wide artwork URL. Only present on main stations.
artworkUrl1x1 string required
Square artwork URL for station display.
artworkUrlNowPlaying1x1 string required
Square artwork URL for now playing display.
audioPriority string required
Preferred stream type: "hls" or "ice".
hlsStreamUrl string required
HLS stream URL (.m3u8).
iceStreamUrl string required
Icecast stream URL (.m3u) as fallback.
shareUrl string required
Web player URL for sharing.
stationScheduleUrl string optional
URL to station schedule JSON. Only present on main stations.
metadataUrl string required
URL to current track metadata.

Station List

ID Station Language Main
1EnglishEnglishYes
2English Old TestamentEnglishNo
3English New TestamentEnglishNo
4Radio Cristiana en EspañolSpanishYes
5El Antiguo TestamentoSpanishNo
6El Nuevo TestamentoSpanishNo
7Deutsch RadioMvGermanYes
8Altes TestamentGermanNo
9Neues TestamentGermanNo
10Христианское РадиоSlavicYes
11Музыкальный КаналSlavicNo
12Детский КаналSlavicNo
13Новый ЗаветSlavicNo
14Ветхий ЗаветSlavicNo

Code Examples

Get All Main Stations

const response = await fetch('https://api.radiomv.studio/appv1.json');
const data = await response.json();

const mainStations = data.stations.filter(s => s.isMain);
// Returns stations with IDs: 1, 4, 7, 10

Get Stations by Language

function getStationsByLanguage(stations, language) {
    return stations.filter(s => s.language === language);
}

const englishStations = getStationsByLanguage(data.stations, 'English');
// Returns stations with IDs: 1, 2, 3

Play Station with Fallback

function getStreamUrl(station) {
    if (station.audioPriority === 'hls') {
        return {
            primary: station.hlsStreamUrl,
            fallback: station.iceStreamUrl
        };
    }
    return {
        primary: station.iceStreamUrl,
        fallback: station.hlsStreamUrl
    };
}

Check for Config Updates

async function checkForUpdates(cachedVersion) {
    const response = await fetch('https://api.radiomv.studio/appv1.json');
    const data = await response.json();

    if (data.config.version !== cachedVersion) {
        // New version available, update cache
        return { updated: true, data };
    }
    return { updated: false };
}