App Configuration API
Station list, stream URLs, metadata paths, artwork, schedules, and app settings — one JSON file that drives a complete RadioMV client.
Endpoint
GET
https://stream.radiomv.com/static/appv3.json
Current configuration (v3). This is the only URL an app needs to hardcode — everything else is discovered from it.
How v3 URLs work
config.baseUrl is the root for every relative path in the file. To build a full URL, prepend it: baseUrl + station.streams.hls → https://stream.radiomv.com/stream/english.m3u8. Paths that already start with https:// (like shareUrl) are used as-is. Keep query strings (e.g. ?v=1 on artwork) intact — they version the cache.
Response Format
{
"config": {
"version": "20260428.2044",
"baseUrl": "https://stream.radiomv.com",
"analytics": "/api/analytics"
},
"navigation": { ... },
"settings": { ... },
"stations": [ ... ]
}
Config Object
version
string
required
Date-based version in format
YYYYMMDD.HHMM. Use for cache invalidation.
baseUrl
string
required
Root URL for every relative path in this file.
analytics
string
required
Relative path of the playback-analytics endpoint (first-party apps POST batched events here).
Navigation Object
Navigation URLs organized by language group — each group has an explore URL (absolute):
{
"navigation": {
"english": { "explore": "https://radiomv.com/support/#english" },
"spanish": { ... },
"german": { ... },
"slavic": { ... }
}
}
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://...",
"share-url": "https://radiomv.com/apps/"
}
}
}
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.
share-url
string
URL to share when recommending the apps.
Stations Array
Array of all station objects. Each station contains:
{
"id": "english",
"name": "English",
"language": "english",
"isMain": true,
"streams": {
"hls": "/stream/english.m3u8",
"mp3": "/stream/english.m3u"
},
"metadata": "/api/metadata/english",
"artwork": {
"1x1": "/assets/english/artwork-1x1.jpg?v=1",
"1x1Small": "/assets/english/artwork-1x1-small.jpg?v=2",
"16x9": "/assets/english/artwork-16x9.jpg?v=1",
"nowPlaying": "/assets/english/artwork-now-playing.jpg?v=1",
"nowPlayingSmall": "/assets/english/artwork-now-playing-small.jpg?v=2",
"miniPlayer": "/assets/english/mini-player.jpg?v=1"
},
"video": "/assets/english/video-loop.mp4?v=1",
"schedule": "/static/schedules/english.json",
"shareUrl": "https://player.radiomv.com/english.html"
}
Station Fields
id
string
required
Station slug (e.g.
english, slavic-nt). Identical to the station IDs used by the Streaming & Metadata API.
name
string
required
Station display name, in the station's own language.
language
string
required
Language group:
english, spanish, german, or slavic. Matches the keys of navigation and settings.
isMain
boolean
required
Whether this is a main station (true) or auxiliary channel (false).
streams.hls
string
required
Relative path of the HLS master playlist (
.m3u8). Preferred stream for apps.
streams.mp3
string
required
Relative path of the MP3 playlist (
.m3u) — fetch it, then follow the stream URL inside. Fallback for players without HLS.
metadata
string
required
Relative path of the now-playing JSON endpoint. Append
/events for the SSE live stream — see Streaming & Metadata.
artwork
object
required
Relative artwork paths:
1x1, 1x1Small, 16x9, nowPlaying, nowPlayingSmall, miniPlayer; some stations add motionArtwork4x3 / motionArtwork1x1 (MP4). Keep the ?v= query — it busts caches on artwork updates.
video
string
optional
Relative path of a background video loop (MP4). Present on some main stations.
schedule
string
optional
Relative path of the station's program schedule JSON. Only present on stations with a published schedule — see Schedule.
shareUrl
string
required
Absolute web-player URL for sharing.
Station List
| ID | Name | Language | Main |
|---|---|---|---|
english | English | english | Yes |
english-ot | English Old Testament | english | No |
english-nt | English New Testament | english | No |
spanish | Radio Cristiana en Español | spanish | Yes |
spanish-ot | El Antiguo Testamento | spanish | No |
spanish-nt | El Nuevo Testamento | spanish | No |
german | Deutsch RadioMv | german | Yes |
german-ot | Altes Testament | german | No |
german-nt | Neues Testament | german | No |
slavic | Христианское Радио | slavic | Yes |
slavic-music | Музыкальный Канал | slavic | No |
slavic-kids | Детский Канал | slavic | No |
slavic-nt | Новый Завет | slavic | No |
slavic-ot | Ветхий Завет | slavic | No |
Code Examples
Fetch Config and Resolve URLs
const response = await fetch('https://stream.radiomv.com/static/appv3.json');
const data = await response.json();
// Resolve a relative path against baseUrl
const resolve = (path) =>
path.startsWith('http') ? path : data.config.baseUrl + path;
Get All Main Stations
const mainStations = data.stations.filter(s => s.isMain);
// Returns: english, spanish, german, slavic
Play a Station
const station = data.stations.find(s => s.id === 'slavic');
const hlsUrl = resolve(station.streams.hls);
// https://stream.radiomv.com/stream/slavic.m3u8 — hand to your player
Show Now Playing
const now = await (await fetch(resolve(station.metadata))).json();
console.log(now.title, now.artist);
// Or subscribe to live updates (SSE)
const es = new EventSource(resolve(station.metadata) + '/events');
Check for Config Updates
async function checkForUpdates(cachedVersion) {
const response = await fetch('https://stream.radiomv.com/static/appv3.json');
const data = await response.json();
if (data.config.version !== cachedVersion) {
// New version available, update cache
return { updated: true, data };
}
return { updated: false };
}
Legacy Versions
appv1.json and appv2.json (served from api.radiomv.studio) are the previous config generations: numeric station IDs, absolute URLs per field, and plain-text metadata endpoints. They remain online for existing app builds but are deprecated — do not use them for new work.