'JSONDecodeError' bij broker API's: Wat betekent het?

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Foutmeldingen & Debugging Live Bots · 2026-02-15 · 9 min leestijd

Een JSONDecodeError is als een kapotte rits op je regenjas midden in een hoosbui: je weet dat je hem nodig hebt, hij hoort te werken, maar hij doet het net niet.

In de wereld van algoritmische trading bots is dit een van de meest voorkomende, irritante foutmeldingen die je zult tegenkomen. Je bot draait op een Raspberry Pi of een VPS, de markt beweegt, en dan opeens: stilstand. De bot crasht. Waarom? Omdat de broker API een boodschap stuurt die niet klopt, en je Python script niet weet wat het ermee moet. Het is een klein moment van chaos dat je hele strategie in de war kan sturen.

Stel je voor: je hebt een bot geschreven die de koers van Bitcoin op Binance volgt en automatisch koopt als de RSI onder de 30 duikt. Je script vraagt elke seconde om de nieuwste data.

Meestal krijg je netjes een bericht terug in JSON-formaat, een standaard taal voor computers om data uit te wisselen.

Maar soms, heel soms, stuurt de exchange een leeg blad papier of een stukje HTML-code in plaats van de verwachte data. Jouw Python script probeert dit te lezen als JSON, faalt, en gooit de error. Het is het digitale equivalent van een foute sleutel in het slot.

Wat is een JSONDecodeError nou eigenlijk?

Om het even simpel te houden: JSON is een manier om data te structureren.

Stel je een Excel-sheet voor, maar dan in tekstvorm. Een regel kan zijn: {"prijs": 50000, "volume": 150}. Jouw Python bot, waarschijnlijk met een library als requests of ccxt, verwacht deze structuur.

Het is de taal die jullie samen spreken. De broker (je exchange zoals Kraken of Bitvavo) belooft om al zijn antwoorden in die taal te schrijven.

Een JSONDecodeError betekent dat de broker zijn belofte heeft gebroken. Het antwoord was geen geldig JSON.

Het was misschien leeg, of het zat vol met onzichtbare karakters, of het was een foutmelding die wél in JSON was, maar dan met een error-code die je bot niet had zien aankomen. Python's json.loads() functie is streng; als er maar één komma ontbreekt of er is een openhaakje vergeten, weigert hij dienst. Je bot kan niet verder, want hij kan de data niet 'lezen'. Waarom is dit zo kritiek?

Omdat je bot vaak in een continue loop draait. Als je script een trade moet uitvoeren en de API geeft een corrupt antwoord, mis je de trade.

Erger nog, als je bot bij elke fout crasht, ben je constant aan het opstarten. Je risicomanagement systeem ligt dan op zijn gat. Je bent blind en doof op het moment dat je juist het scherpst moet zijn. Daarom is het begrijpen van deze error essentiel voor elke serieuze automatische trader.

De daders: Waarom gebeurt dit bij live bots?

De meest voorkomende oorzaak is simpelweg een tijdelijk netwerkprobleem. Stel je voor dat je bot een request stuurt naar de API van Bitvavo.

Het signaal onderweg wordt even onderbroken. De connectie valt weg, maar de server stuurt toch nog een stukje data terug: misschien een HTML-pagina met "Connection Timed Out". Dat is geen JSON. Jouw script probeert dit te lezen en faalt.

Dit gebeurt vaker dan je denkt, zeker als je een budget VPS draait met een instabiele internetverbinding. Een andere boosdoener is rate limiting.

Elke broker API heeft een limiet. Bijvoorbeeld, bij Binance mag je gratis 1200 requests per minuut versturen vanaf je IP-adres.

Ga je hier overheen? Dan word je niet vriendelijk gevraagd te stoppen; je krijgt een ban voor een paar seconden of een specifieke error-boodschap. Soms is die boodschap niet in JSON, maar simpelweg een "429 Too Many Requests" statuscode met een lege body.

Je script ziet een lege body, probeert die te decoderen en tadaa: JSONDecodeError. API-updates zijn ook een beruchte oorzaak.

Je gebruikt misschien een specifieke versie van de API van Kraken. Zij updaten hun systeem. Opeens veranderen ze de structuur van een antwoord of gebruiken ze een andere manier van coderen.

Als je code niet is voorbereid op deze veranderingen, of als je een library zoals ccxt niet up-to-date houdt, kan een plotselinge update je bot lamleggen.

De broker verandert de regels, en jouw bot kent de nieuwe regels nog niet. Er is ook een kans dat je eigen code de boel verstopt.

Misschien stuur je een verkeerd formatted verzoek. Als je per ongeluk een vreemd teken meestuurt in je request, kan de server daarop reageren met een onverwacht antwoord.

Of misschien zit er in de data van de exchange zelf een bug. Een ticker-symbool dat opeens een vreemd karakter bevat. Het zijn details, maar in de wereld van algorithmic trading draait alles om details. Één foutje en je hele strategie ligt stil.

De impact: Wat doet deze error met je strategie?

Stel je voor: je hebt een bot die scant naar prijsverschillen tussen exchanges (arbitrage). De bot draait op een krachtige server die €50 per maand kost. Hij draait 24/7. Tijdens een plotse prijsstijging van Ethereum moet je bot direct kopen op Exchange A en verkopen op Exchange B.

Dat is het moment van de waarheid. Maar op dat moment gooit je bot een JSONDecodeError.

De verbinding met Exchange A is even niet perfect. Je bot crasht.

Hij stopt met draaien totdat je hem handmatig herstart. In de 5 minuten die het duurt voordat je het merkt en herstelt, is de prijs alweer gezakt. De winst is weg.

Misschien heb je wel €1000 aan potentiële winst gemist door die ene, simpele error.

Het voelt als een gemiste trein die je net op tijd had kunnen halen. De emotie die hierbij komt kijken is frustratie, en frustratie leidt tot overhaaste beslissingen. Erger nog is wat er gebeurt als je geen goede error handling hebt. Veel beginnende programmeurs schrijven code die stopt bij elke error.

Een professionele bot draait in een 'try-except' blok. Dit betekent: "Probeer dit, maar als het mislukt, doe dan dit alternatief." Zonder dit loop je het risico dat je bot na een onverwachte 'Insufficient Funds' error offline gaat.

Je risicomanagement systeem, wat misschien een stop-loss had moeten activeren, werkt dan niet meer.

Je staat met lege handen. Stel je een andere situatie voor: een mean-reversion bot die focust op aandelen via een broker zoals Interactive Brokers (IBKR). De bot draait op een Windows machine.

De API van IBKR is complex. Als je bot een JSONDecodeError krijgt, weet je soms niet of het aan je internet ligt, aan de broker, of aan je eigen code. De onzekerheid zorgt ervoor dat je elke keer twijfelt: "Is mijn strategie wel goed, of werkt mijn bot gewoon niet?" Je vertrouwen in je eigen systeem brokkelt af.

Oplossingen: Bouw een bot die niet omvalt

De eerste en belangrijkste stap is het implementeren van robuuste error handling. In Python betekent dit werken met try en except. Je moet je request naar de API nooit rechtstreeks afhandelen.

Stop het in een blok. Probeer de data op te halen.

Probeer de JSON te decoderen. Als dat mislukt, vang de JSONDecodeError op. Log de fout.

"Je bot moet een marathon lopen, geen sprint. Als hij struikelt over een steentje, moet hij gewoon weer opstaan en doorlopen."

Sla de ruwe data op in een tekstbestand zodat je later kunt zien wat er misging. En vooral: zorg dat je bot doordraait. Een andere cruciale tip is het beheren van je dependencies.

Gebruik niet zomaar de standaard requests library zonder vangnetten. Gebruik libraries als ccxt voor crypto.

Deze libraries zijn specifiek gebouwd voor exchanges en hebben vaak al ingebouwde herstelmechanismen. Ze proberen een request bijvoorbeeld automatisch opnieuw als er een tijdelijke fout is. Ze weten hoe de API's van Binance, Kraken en Bybit in elkaar steken en vangen veel standaardfouten al voor je op. Timing is ook key.

Stel je bot in op een redelijke frequentie. Als je elke 0.1 seconde een request stuurt naar een exchange die een limiet heeft van 10 per seconde, vraag je om moeilijkheden.

Bouw een 'rate limiter' in je code. Dit is een stukje code dat ervoor zorgt dat je niet te snel stuurt.

Wacht bijvoorbeeld 1 seconde tussen requests. Dit verlaagt de kans op errors aanzienlijk en houdt je in de goede gratie bij de broker. Het voelt langzamer, maar het is veiliger.

Test je code niet alleen in een backtest, maar ook in een 'paper trading' omgeving. Laat je bot een weekje draaien met nepgeld voordat je echt geld inzet. Voorkom dure fouten door je trading bot grondig te debuggen als je JSONDecodeErrors krijgt.

Zorg dat je een dashboard bouwt (bijvoorbeeld met Grafana) dat waarschuwt als je bot offline gaat.

Een simpele notificatie via Telegram of Discord kan je helpen om direct in te grijpen. Wees voorbereid, want in de live markt is geen plek voor onverwachte errors.

Praktische tips voor een stabiele bot

Hier is een korte checklist om je bot stabieler te maken: Als je een broker gebruikt zoals Interactive Brokers, let dan extra op de TWS API.

  1. Gebruik Always-Connect: Zorg dat je verbinding met de API altijd actief is en herstart bij verlies.
  2. Log alles: Schrijf elke error, inclusief de ruwe data die binnenkwam, weg naar een logbestand. Zo los je het later op.
  3. Exponential Backoff: Als een request faalt, wacht dan 1 seconde, probeer opnieuw. Faalt het weer? Wacht 2 seconden. Dan 4 seconden. Zo overlaad je de server niet.
  4. Check je data: Voordat je JSON.loads() aanroept, check of de data niet leeg is (bijv. len(response.content) > 0).

Deze vereist vaak specifieke instellingen in de TWS software zelf. Zorg dat "Read-Only API" uitstaat als je wilt traden, maar zet de juiste rechten aan. Een verkeerde instelling leidt vaak tot vage errors die niet meteen als JSONDecodeError te herkennen zijn, maar wel dezelfde impact hebben.

Ken je broker, ken je API. Investeer in een stabiele VPS.

Een server van €5 per maand in een datacenter ver weg van de exchange servers kan latency veroorzaken.

Een server van €20-€30 per maand bij een provider die bekend staat om stabiliteit (zoals Vultr of DigitalOcean) betaalt zichzelf terug in gemiste errors en betere trade-executies. Zie het niet als kostenpost, maar als investering in je infrastructuur. Een goede kok heeft goede messen nodig, een goede trader heeft een stabiele bot. Tot slot, onthoud dat technologie niet perfect is. Fouten zullen gebeuren.

De markt is hard. Een JSONDecodeError is vervelend, maar het is ook een leermoment.

Het laat zien waar je systeem kwetsbaar is. Door je bot slimmer te maken, met vangnetten en herstelmechanismen, bouw je niet alleen een winstgevende strategie, maar ook een robuuste machine die bestand is tegen de chaos van de markt. Ga er rustig voor zitten, check je code, en maak het waterdicht.

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Over Alex de Vries

Alex is een ervaren quantitatief analist en Python-ontwikkelaar die complexe trading concepten vertaalt naar begrijpelijke, praktische handleidingen voor zowel beginners als gevorderden.

Volgende stap
Bekijk alle artikelen over Foutmeldingen & Debugging Live Bots
Ga naar overzicht →