Ga naar de inhoud

API

Bouw iets met de gegevens van STROBE Radio. Gratis, alleen lezen en met een eigen sleutel.

Met de STROBE API haal je op wat er nu draait, wat er op de gids staat, wie onze DJ’s zijn, wat er in het nieuws staat en welke uitzendingen je kunt terugkijken. Het gaat om dezelfde informatie als op de site. Je kunt er niets mee wijzigen en je ziet er niets mee dat niet openbaar is.

De API is versie v1 en staat op https://stroberadio.nl/api/v1. Elke aanvraag heeft een API-sleutel nodig.

Snel beginnen

  1. Maak een account. Heb je er nog geen? Maak een gratis account en bevestig je e-mailadres.
  2. Maak een sleutel. Open Mijn STROBE, kies het tabblad API en geef je sleutel een naam. Kopieer hem; je kunt hem later onder ‘Toon sleutel’ weer bekijken.
  3. Doe een aanvraag. Stuur de sleutel mee in de kop Authorization (of als ?key= achter het adres). Probeer het met onderstaand voorbeeld.

curl

curl https://stroberadio.nl/api/v1/now \
  -H "Authorization: Bearer sk_jouw_sleutel"

JavaScript (Node.js of een server)

const res = await fetch('https://stroberadio.nl/api/v1/now', {
  headers: { Authorization: `Bearer ${process.env.STROBE_API_KEY}` },
});
if (res.status === 429) {
  const wacht = Number(res.headers.get('Retry-After')) || 60;
  // wacht "wacht" seconden en probeer het daarna opnieuw
}
const { data } = await res.json();
console.log(`${data.song.artist} - ${data.song.title}`);

Python

import os, requests

r = requests.get(
    "https://stroberadio.nl/api/v1/schedule?days=3",
    headers={"Authorization": "Bearer " + os.environ["STROBE_API_KEY"]},
    timeout=10,
)
r.raise_for_status()
for dag in r.json()["data"]:
    print(dag["date"], [i["title"] for i in dag["items"]])

Authenticatie

Stuur je sleutel mee in een kop, op één van deze twee manieren:

Authorization: Bearer sk_jouw_sleutel
X-API-Key: sk_jouw_sleutel

Of, voor snel proberen in de browser, achter het adres:

https://stroberadio.nl/api/v1/now?key=sk_jouw_sleutel

Een sleutel begint met sk_ en is 35 tekens lang. Je ziet hem in Mijn STROBE (tabblad API) altijd terug onder ‘Toon sleutel’. Ben je hem toch kwijt, of is hij uitgelekt, maak dan een nieuwe en trek de oude in. Staan er zowel een kop als ?key=, dan telt de kop.

  • Een sleutel in het adres (?key=) is handig, maar minder veilig: adressen komen in browsergeschiedenis, logbestanden van proxy’s en in de Referer-kop terecht. Gebruik voor je eigen programma liever de kop. Wij zetten de sleutel niet in ons eigen logboek.
  • Gebruik je sleutel op een server, niet in code die bezoekers kunnen lezen (een website of app die je verspreidt). Dan kan iedereen hem overnemen en gebruikt die jouw limiet.
  • Is je sleutel toch uitgelekt? Trek hem in via Mijn STROBE → API en maak een nieuwe.

Vanuit een browser (CORS) mag het wel, de API staat dat toe. Dat is bedoeld om uit te proberen, niet voor een openbare website.

Limieten

Elke sleutel heeft een limiet per minuut en per dag. Een dag loopt van middernacht tot middernacht, in Nederlandse tijd.

SleutelPer minuutPer dag
Luisteraar (standaard)303000
Partner of app (op afspraak)meermeer

Je mag maximaal 3 sleutels tegelijk hebben. Heb je meer nodig, mail ons en vertel wat je bouwt.

Elk antwoord vertelt hoe je ervoor staat:

X-RateLimit-LimitJe limiet per minuut.
X-RateLimit-RemainingHoeveel aanvragen je deze minuut nog hebt.
X-RateLimit-ResetOver hoeveel seconden de minuut opnieuw begint.
X-RateLimit-Day-LimitJe limiet per dag.
X-RateLimit-Day-RemainingHoeveel aanvragen je vandaag nog hebt.
Retry-AfterAlleen bij een 429: na hoeveel seconden je het opnieuw mag proberen.

Zit je boven de limiet, dan krijg je status 429. Wacht dan het aantal seconden uit Retry-After. Vraag niet steeds hetzelfde op: de gegevens veranderen niet elke seconde. Het nummer dat nu draait verandert hooguit elke paar minuten, dus één keer per 10 tot 15 seconden is meer dan genoeg. Aanvragen zonder geldige sleutel of die steeds opnieuw geweigerd worden, kunnen leiden tot een tijdelijke blokkade van je IP-adres.

Antwoorden

Alle antwoorden zijn JSON (UTF-8). Een lijst heeft dit vaste vorm:

{
  "data": [
    "…"
  ],
  "meta": {
    "total": 42,
    "limit": 20,
    "offset": 0
  }
}

Met limit (1 tot 100, standaard 20) en offset loop je door een lange lijst. Eén ding of een samenstelling heeft alleen data.

  • Tijdstippen met een datum erbij (zoals played_at) zijn ISO 8601 in UTC, bijvoorbeeld 2026-11-05T14:22:00.000Z.
  • Datums (2026-11-05) en kloktijden (14:00) zijn Nederlandse tijd.
  • Dagen van de week zijn getallen: 0 is zondag, 1 maandag, tot en met 6 zaterdag.
  • Teksten zijn in het Nederlands, zonder opmaak. Afbeeldingen zijn volledige adressen, of een lege tekst als er geen is.
  • Er komen soms velden bij. Bouw je programma zo dat het onbekende velden negeert.

Endpoints

Alles is GET. Het begin van elk adres is https://stroberadio.nl/api/v1.

Jouw sleutel

GET/api/v1/me

Laat zien welke sleutel je gebruikt en hoeveel aanvragen je nog hebt. Handig om je koppeling te testen.

Voorbeeld van een antwoord

{
  "data": {
    "name": "Mijn bot",
    "kind": "user",
    "limits": {
      "per_minute": 30,
      "per_day": 3000
    }
  }
}

Nu op de radio

GET/api/v1/now

Het nummer dat nu draait, wat er hierna komt, de laatste nummers en de show die nu in de lucht is.

Voorbeeld van een antwoord

{
  "data": {
    "live": true,
    "listeners": 42,
    "song": {
      "title": "Blah Blah Blah",
      "artist": "Armin van Buuren",
      "album": "",
      "art": "https://…/art.jpg",
      "played_at": "2026-11-05T14:22:00.000Z",
      "elapsed": 61,
      "duration": 180
    },
    "next": {
      "title": "The Business",
      "artist": "Tiësto",
      "art": ""
    },
    "history": [
      {
        "title": "Mooi Lied",
        "artist": "Zanger",
        "art": "",
        "played_at": "2026-11-05T14:18:00.000Z"
      }
    ],
    "show": {
      "slug": "hard-tonight",
      "title": "Hard Tonight",
      "host": "Dante",
      "start": "14:00",
      "end": "16:00",
      "tv_only": false
    }
  }
}

Stream-status

GET/api/v1/status

Of er geluid en beeld is, met de adressen van de streams.

Voorbeeld van een antwoord

{
  "data": {
    "online": true,
    "audio": true,
    "video": false,
    "streams": {
      "audio": "https://stream.heidemanmedia.nl/listen/strobe/radio.mp3",
      "video": ""
    }
  }
}

Programma’s

GET/api/v1/shows

Alle vaste programma’s met dagen en tijden.

ParameterTypeStandaardUitleg
daystring—Alleen programma’s van deze dag: 0 t/m 6 (0 is zondag) of ma, di, wo, do, vr, za, zo.
limitinteger20Hoeveel resultaten je wilt zien (1 tot 100).
offsetinteger0Vanaf het hoeveelste resultaat (voor de volgende pagina).

Voorbeeld van een antwoord

{
  "data": [
    {
      "slug": "hard-tonight",
      "title": "Hard Tonight",
      "genre": "Hardstyle",
      "host": "Dante",
      "djs": [
        "Dante"
      ],
      "description": "…",
      "image": "https://stroberadio.nl/uploads/…",
      "days": [
        1,
        2,
        3,
        4
      ],
      "days_text": "Maandag t/m donderdag",
      "start": "14:00",
      "end": "16:00",
      "tv_only": false
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

Gids (komende dagen)

GET/api/v1/schedule

De uitzendingen per datum, inclusief extra uitzendingen en programma’s die niet doorgaan.

ParameterTypeStandaardUitleg
daysinteger7Hoeveel dagen vooruit, vanaf vandaag (1 tot 14).

Voorbeeld van een antwoord

{
  "data": [
    {
      "date": "2026-11-05",
      "weekday": "donderdag",
      "items": [
        {
          "type": "show",
          "slug": "hard-tonight",
          "title": "Hard Tonight",
          "host": "Dante",
          "djs": [
            "Dante"
          ],
          "start": "14:00",
          "end": "16:00",
          "cancelled": false,
          "reason": "",
          "tv_only": false
        },
        {
          "type": "extra",
          "slug": "2026-11-05-festivalavond",
          "title": "Festivalavond",
          "host": "",
          "djs": [],
          "start": "20:00",
          "end": "23:00",
          "cancelled": false,
          "reason": "",
          "tv_only": false
        }
      ]
    }
  ]
}

DJ’s

GET/api/v1/djs

De DJ’s en presentatoren met hun korte profiel.

ParameterTypeStandaardUitleg
limitinteger20Hoeveel resultaten je wilt zien (1 tot 100).
offsetinteger0Vanaf het hoeveelste resultaat (voor de volgende pagina).

Voorbeeld van een antwoord

{
  "data": [
    {
      "slug": "dante-heideman",
      "name": "Dante Heideman",
      "show": "Hard Tonight",
      "bio": "…",
      "image": "https://stroberadio.nl/uploads/…",
      "socials": {
        "instagram": "https://instagram.com/…"
      }
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

Nieuws

GET/api/v1/news en /api/v1/news/{slug}

De nieuwsberichten, nieuwste eerst. Met /news/{slug} haal je één bericht op, met de volledige tekst.

ParameterTypeStandaardUitleg
limitinteger20Hoeveel resultaten je wilt zien (1 tot 100).
offsetinteger0Vanaf het hoeveelste resultaat (voor de volgende pagina).

Voorbeeld van een antwoord

{
  "data": [
    {
      "slug": "nieuwe-show",
      "category": "Nieuws",
      "date": "2026-11-01T09:00:00.000Z",
      "title": "Nieuwe show op vrijdag",
      "excerpt": "…",
      "image": "",
      "url": "https://stroberadio.nl/nieuws/nieuwe-show"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

Agenda en extra uitzendingen

GET/api/v1/events

Extra uitzendingen en evenementen. Standaard alleen wat vandaag of later is.

ParameterTypeStandaardUitleg
fromdatumvandaagVanaf deze datum (JJJJ-MM-DD). Standaard vandaag.
todatum—Tot en met deze datum (JJJJ-MM-DD).
limitinteger20Hoeveel resultaten je wilt zien (1 tot 100).
offsetinteger0Vanaf het hoeveelste resultaat (voor de volgende pagina).

Voorbeeld van een antwoord

{
  "data": [
    {
      "slug": "2026-11-07-festivalavond",
      "title": "Festivalavond",
      "date": "2026-11-07",
      "start": "20:00",
      "end": "23:00",
      "genre": "EDM",
      "host": "",
      "djs": [
        "Dante"
      ],
      "description": "…"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

Gemist

GET/api/v1/clips

Uitzendingen en fragmenten om terug te kijken, nieuwste eerst.

ParameterTypeStandaardUitleg
limitinteger20Hoeveel resultaten je wilt zien (1 tot 100).
offsetinteger0Vanaf het hoeveelste resultaat (voor de volgende pagina).

Voorbeeld van een antwoord

{
  "data": [
    {
      "id": 12,
      "title": "Hard Tonight van vorige week",
      "show": "Hard Tonight",
      "date": "2026-10-30",
      "url": "https://www.youtube.com/watch?v=…",
      "image": "",
      "duration": "1:58:00",
      "description": "…"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 20,
    "offset": 0
  }
}

Andere adressen onder /api (zoals /api/tv) zijn voor onze eigen site en apps. Die kunnen zonder bericht veranderen en zijn niet bedoeld voor gebruik door anderen. Gebruik /api/v1.

Foutmeldingen

Bij een fout krijg je de bijbehorende HTTP-status en dit antwoord. Kijk naar code: die blijft gelijk, de tekst kan veranderen.

{
  "error": {
    "code": "key_required",
    "message": "Voor deze API heb je een API-sleutel nodig. …"
  },
  "docs": "https://stroberadio.nl/api"
}
StatuscodeWat het betekent
401key_requiredJe stuurde geen API-sleutel mee.
401invalid_keyDe sleutel is niet geldig (typfout of nooit bestaan).
401key_revokedDe sleutel is ingetrokken, door jou of door ons.
403access_deniedHet account achter deze sleutel heeft geen toegang meer tot de API.
403ip_blockedHet IP-adres waarmee je aanvraagt is geblokkeerd voor de API.
404not_foundDit onderdeel bestaat niet.
405method_not_allowedAlleen GET (lezen) is mogelijk.
429rate_limitedJe zit boven de limiet per minuut. Wacht het aantal seconden uit Retry-After.
429daily_limitJe zit boven de limiet per dag. Morgen kun je weer verder.
500server_errorEr ging iets mis aan onze kant.
503api_disabledDe API staat tijdelijk uit.
503upstream_unavailableDe bron van deze gegevens (bijvoorbeeld de radioserver) is even niet bereikbaar.

Regels en privacy

Versies

Dit is v1 (uitgave 1.0.0). Binnen v1 voegen we alleen dingen toe, we halen niets weg en veranderen niets van betekenis. Bij een grotere wijziging komt er een v2 en blijft v1 nog minstens zes maanden werken. Wij kondigen dat vooraf aan op deze pagina.

1.0.0: eerste uitgave met me, now, status, shows, schedule, djs, news, events en clips.

Vragen of iets nodig dat er niet in zit? Mail ons.

STROBE

EDM, hardstyle en pop. Dag en nacht in de lucht.