API et applications
L'API publique de radioonair alimente les applications Roku, Fire TV, Android TV, Apple TV, iOS et Android, ainsi que les sites partenaires : annuaire des radios, flux, pré-roll vidéo et statistiques d'écoute. Les réponses sont en JSON (UTF-8), sauf la publicité qui suit le standard VAST 4.2.
Démarrer
Adresse de base : https://radioonair.fr/api/v1
Chaque application s'identifie avec l'en-tête X-Api-Key. Les clés sont délivrées par radioonair, une par application : demandez la vôtre à contact@radioonair.fr. L'en-tête est facultatif pour l'instant, il deviendra obligatoire : envoyez-le dès maintenant. Quand vous ne pouvez pas ajouter d'en-tête (URL VAST confiée à un SDK publicitaire), ajoutez api_key=VOTRE_CLE à l'adresse.
Les erreurs renvoient un code HTTP et un message en français : 401 pour une clé manquante ou invalide (quand la clé est exigée), 404 pour une radio ou un article introuvable. L'API accepte les appels depuis un navigateur (CORS ouvert).
curl -H "X-Api-Key: VOTRE_CLE" "https://radioonair.fr/api/v1/stations?genre=jazz-blues&perPage=20"Annuaire
GET/stations
q- recherche dans le nom, la ville et le slogan
genre- slug d'un genre (voir /genres), par exemple
jazz-blues country- code pays ISO à deux lettres, par exemple
BE region- slug d'une région, par exemple
fr-bretagne sortpopular(par défaut),recentounamepage, perPage- pagination, 24 radios par page par défaut, 100 au plus
slugs- liste de slugs séparés par des virgules (favoris) : renvoie ces radios dans cet ordre, sans pagination
Exemple de réponse
{
"items": [
{
"id": "6f1c2a7e-4b1d-4c8e-9a51-0e3f7d2b9c10",
"slug": "radio-exemple",
"name": "Radio Exemple",
"tagline": "La radio de la vallée",
"logo": "https://radioonair.fr/media/logos/6f1c2a7e.webp",
"url": "https://radioonair.fr/radio/radio-exemple",
"city": "Annecy",
"region": "Auvergne-Rhône-Alpes",
"country": "FR",
"genres": [
"Hits",
"Locale et proximité"
],
"online": true,
"nowPlaying": "Artiste - Titre"
}
],
"total": 1,
"page": 1,
"pages": 1
}GET/stations/{slug}
streams donne les flux dans l'ordre de préférence, en HLS (hls) ou en progressif (mp3, aac, ogg, opus, flac) : lisez le premier qui fonctionne. Les flux disponibles uniquement en http sont relayés en https par radioonair.Exemple de réponse
{
"station": {
"id": "6f1c2a7e-4b1d-4c8e-9a51-0e3f7d2b9c10",
"slug": "radio-exemple",
"name": "Radio Exemple",
"tagline": "La radio de la vallée",
"logo": "https://radioonair.fr/media/logos/6f1c2a7e.webp",
"url": "https://radioonair.fr/radio/radio-exemple",
"city": "Annecy",
"region": "Auvergne-Rhône-Alpes",
"country": "FR",
"genres": [
"Hits",
"Locale et proximité"
],
"online": true,
"nowPlaying": "Artiste - Titre",
"streams": [
{
"id": "0b8e…",
"url": "https://flux.radio-exemple.fr/live/playlist.m3u8",
"format": "hls",
"bitrate": 128
},
{
"id": "51c4…",
"url": "https://radioonair.fr/stream/51c4…",
"format": "mp3",
"bitrate": 128
}
],
"description": "…",
"website": "https://radio-exemple.fr",
"fm": "98.2 MHz (Annecy)",
"dab": null
}
}GET/genres
Exemple de réponse
{
"items": [
{
"slug": "hits",
"name": "Hits",
"count": 412
},
{
"slug": "jazz-blues",
"name": "Jazz et blues",
"count": 57
}
]
}GET/home
Exemple de réponse
{
"featured": [
{
"id": "6f1c2a7e-4b1d-4c8e-9a51-0e3f7d2b9c10",
"slug": "radio-exemple",
"name": "Radio Exemple",
"tagline": "La radio de la vallée",
"logo": "https://radioonair.fr/media/logos/6f1c2a7e.webp",
"url": "https://radioonair.fr/radio/radio-exemple",
"city": "Annecy",
"region": "Auvergne-Rhône-Alpes",
"country": "FR",
"genres": [
"Hits",
"Locale et proximité"
],
"online": true,
"nowPlaying": "Artiste - Titre"
}
],
"popular": [
"…"
],
"recent": [
"…"
],
"genres": [
{
"slug": "hits",
"name": "Hits",
"count": 412
}
],
"articles": [
{
"slug": "le-dab-arrive-dans-la-vallee",
"title": "Le DAB+ arrive dans la vallée",
"excerpt": "Douze radios rejoignent le multiplex local.",
"category": "dab",
"publishedAt": "2026-11-06T08:00:00.000Z",
"aiGenerated": true,
"url": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee",
"image": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee/opengraph-image"
}
]
}Actu
GET/articles
image est une image 1200 × 630 générée pour chaque article.category- rubrique, par exemple
audiencesoudab page, perPage- pagination, 12 articles par page par défaut, 50 au plus
Exemple de réponse
{
"items": [
{
"slug": "le-dab-arrive-dans-la-vallee",
"title": "Le DAB+ arrive dans la vallée",
"excerpt": "Douze radios rejoignent le multiplex local.",
"category": "dab",
"publishedAt": "2026-11-06T08:00:00.000Z",
"aiGenerated": true,
"url": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee",
"image": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee/opengraph-image"
}
],
"total": 1,
"page": 1,
"pages": 1
}GET/articles/{slug}
html ne contient que des balises simples (titres, paragraphes, listes, liens, citations).Exemple de réponse
{
"article": {
"slug": "le-dab-arrive-dans-la-vallee",
"title": "Le DAB+ arrive dans la vallée",
"excerpt": "Douze radios rejoignent le multiplex local.",
"category": "dab",
"publishedAt": "2026-11-06T08:00:00.000Z",
"aiGenerated": true,
"url": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee",
"image": "https://radioonair.fr/actu/le-dab-arrive-dans-la-vallee/opengraph-image",
"html": "<p>…</p><h2>…</h2><p>…</p>",
"tags": [
"DAB+",
"Annecy"
],
"sources": [
{
"title": "Communiqué du multiplex",
"url": "https://exemple.fr/communique"
}
],
"author": "La rédaction",
"updatedAt": "2026-11-06T08:00:00.000Z"
}
}Publicité et écoute
GET/ads/vast?station={id}&device={roku|firetv|androidtv|tvos|ios|android}
<VAST/> vide signifie qu'il n'y a pas de publicité : lancez le flux directement. Appelez cette adresse à chaque lancement : le serveur choisit lui-même quand diffuser une publicité (au plus une toutes les 5 minutes pour un même auditeur).Réponse sans publicité
<?xml version="1.0" encoding="UTF-8"?><VAST version="4.2" xmlns="http://www.iab.com/VAST"></VAST>POST/sessions
preroll indique si une publicité a été jouée juste avant, platform le nom et la version de l'application. Si id vaut null, l'écoute n'est pas comptée : continuez sans envoyer de ping.Corps de la requête, puis réponse
{
"station": "6f1c2a7e-4b1d-4c8e-9a51-0e3f7d2b9c10",
"device": "roku",
"preroll": true,
"platform": "radioonair-roku/1.0.0"
}
{
"id": "a3f0c9d2-…"
}POST/sessions/{id}/ping
{ "ok": false }, ouvrez-en une nouvelle.Exemple de réponse
{
"ok": true
}POST/sessions/{id}/stop
Exemple de réponse
{
"ok": true
}Intégrer le lecteur
Quand l'auditeur choisit une radio :
- récupérez la radio et ses flux avec
GET /stations/{slug}; - demandez le pré-roll avec
GET /ads/vastet jouez-le s'il y en a un ; - lancez ensuite le premier flux qui fonctionne ;
- quand le son démarre, ouvrez une session (
POST /sessions), envoyez un ping toutes les 60 secondes, puisstopà la fin.
Roku : passez l'adresse VAST au Roku Advertising Framework (setAdUrl(), puis getAds() et showAds()) et lancez le flux quand la publicité est terminée.
iOS, Android, Fire TV, Android TV et Apple TV : utilisez le SDK Google IMA avec l'adresse VAST comme adTagUrl, et lancez le flux quand le SDK demande la reprise du contenu (CONTENT_RESUME_REQUESTED) ou signale une erreur.
Ne déclenchez aucun suivi vous-même : impressions, quartiles, clics et erreurs sont décrits dans le VAST et le SDK les envoie. Si la publicité n'a pas démarré au bout de 4 secondes, abandonnez-la et lancez la radio : l'écoute passe avant la publicité.
https://radioonair.fr/api/v1/ads/vast?station=6f1c2a7e-4b1d-4c8e-9a51-0e3f7d2b9c10&device=roku&api_key=VOTRE_CLEDescription OpenAPI
La description complète de l'API au format OpenAPI 3.1 est disponible à l'adresse https://radioonair.fr/api/v1/openapi.json. Elle s'importe dans Postman, Insomnia ou un générateur de client.
Une question, une clé à demander ou un partenariat : contact@radioonair.fr.