Als je op zoek bent naar Frankfurter API-alternatieven, heb je er waarschijnlijk al iets mee gelanceerd. Frankfurter is voor een hele generatie zijprojecten de standaard gratis wisselkoers-API: geen API-sleutel, geen registratie, geen quotum, een schoon REST-oppervlak en open source code die je in één middag doorleest. Dan verandert er iets — een compliancevraag, een bug in het weekend, een klant die intraday koersen nodig heeft — en vraag je je af wat er nog meer is.
Deze gids kijkt eerlijk naar die beslissing. Hij behandelt wat Frankfurter in 2026 werkelijk doet (de meeste vergelijkingsartikelen werken met verouderde informatie), de vijf concrete beperkingen die teams doen vertrekken, en de drie realistische routes: zelf hosten, overstappen naar een commerciële API met sleutel, of een hybride draaien. Aan het eind staat een migratievoorbeeld.
Wat Frankfurter in 2026 werkelijk is
Vrijwel elk overzicht van "beste gratis valuta-API's" beschrijft Frankfurter nog steeds als "ECB-koersen, zo'n 30 valuta's, geen weekenddata". Dat klopte jarenlang. Het klopt niet meer.
De v2-API op frankfurter.dev volgt dagkoersen van 84 centrale banken, dekt 201 valuta's en heeft historie die teruggaat tot 1948. Hij is echt gratis voor commercieel gebruik, vereist geen authenticatie, publiceert geen maandelijks of dagelijks quotum en levert naast JSON ook CSV en NDJSON. Er is een OpenAPI-specificatie, een llms.txt en een MCP-server voor agent-workflows. Zelf hosten kan met Docker.
Dat is een sterker product dan de overzichten toegeven, en het is de moeite waard om het duidelijk te zeggen: voor heel veel projecten is Frankfurter het juiste antwoord en zou je niet moeten migreren. Bouw je een tracker voor persoonlijke financiën, een naslagpagina over valuta's, een facturatietool die koersen één keer per dag vastzet, of een data-sciencenotebook dat tien jaar maandgemiddelden ophaalt, dan doet Frankfurter dat goed en gratis.
De rest van dit artikel gaat over de gevallen waarin dat niet zo is.
Vijf beperkingen die teams naar Frankfurter API-alternatieven doen zoeken
1. Dagelijkse referentiekoersen zijn geen live koersen
Dit is de structurele beperking, en het is geen fout — het is simpelweg wat de databron is. Referentiekoersen van centrale banken worden één keer per werkdag gepubliceerd. De ECB publiceert bijvoorbeeld haar euro-referentiekoersen elke werkdag rond 16:00 CET. Frankfurter geeft die getallen trouw door.
Dat betekent dat een koers die je om 09:00 ophaalt en een koers om 15:00 hetzelfde getal zijn, ook als de markt er tussenin 1,2% is bewogen. Bij een converter die alleen weergeeft, merkt niemand het. Bij een afrekenpagina, een uitbetalingsberekening of overal waar een klant jouw getal met Google vergelijkt, wordt die vertraging een supportticket.
Heeft je product koersen nodig die gedurende de dag bewegen, dan heb je een marktdatabron nodig in plaats van een referentiekoersbron. De Finexly API ververst elke minuut tijdens markturen over 170+ valuta's: dat is een ander datamodel, niet een betere versie van hetzelfde. Ons artikel over waar wisselkoers-API's hun data vandaan halen gaat dieper op het onderscheid in.
2. Er zijn geen rijen voor weekenden en feestdagen
Centrale banken publiceren niet op zaterdag, zondag of nationale feestdagen. Een query voor 2026-08-23 levert dus niets bruikbaars op, en een tijdreeks over een maand heeft ongeveer 21 rijen, geen 31.
Elk team loopt er op dezelfde manier tegenaan: een nachtelijke job draait op zondag, krijgt een leeg of verschoven resultaat en crasht — of, veel erger, schrijft stilletjes een null in het grootboek. Bouw je op dagkoersen van welke centralebankbron dan ook, dan heb je een expliciet beleid voor doorschuiven nodig, en dat moet je vastleggen, want "gebruik de laatst gepubliceerde koers" en "sla de rij over" leveren verschillende jaarrekeningen op.
3. Gemengde koersen kunnen na publicatie verschuiven
Standaard mengt Frankfurter koersen van alle bijdragende bronnen. De eigen FAQ is verfrissend direct over het gevolg: de laatste decimalen kunnen verschuiven zodra nieuwe data binnenkomt, en voor compliance moet je op één specifieke bron filteren.
Voor algemeen gebruik is dat een volstrekt redelijk ontwerp. Het wordt een probleem als je een koers opslaat, aan een gebruiker toont en later afstemt tegen een nieuwe ophaalactie: je vindt kleine verschillen die erg lastig aan een accountant uit te leggen zijn. De oplossing aan Frankfurter-zijde is providers=ECB meegeven (of de autoriteit die jou reguleert) in plaats van de menging te accepteren. De oplossing in je eigen systeem is de koers die je op transactiemoment werkelijk gebruikte te persisteren en hem nooit opnieuw af te leiden. Die regel geldt voor elke aanbieder, en we behandelen hem in de gids over wisselkoersen en belastingrapportage.
4. Geen API-sleutel betekent geen quotum — en geen zicht
"Geen API-sleutel nodig" is Frankfurters beste eigenschap en zijn meest onderschatte risico. Omdat er geen sleutel is:
- Heb je geen quotum per applicatie. Je deelt een publieke rate limiter met het hele internet, inclusief degene die hem nu vanuit een slecht geschreven loop staat te bestoken.
- Heb je geen gebruikstelemetrie. Geen dashboard vertelt je dat je aanroepvolume afgelopen dinsdag verdrievoudigde.
- Heb je geen supportrelatie. Er is een statuspagina en een GitHub-issuetracker, meer dan veel gratis diensten bieden, maar geen SLA en niemand om te bellen.
Het advies van het project zelf is expliciet: bij hoog volume responses cachen, zelf hosten of de datasets rechtstreeks bevragen. Dat is eerlijk advies, en het is ook het moment waarop veel teams Frankfurter API-alternatieven gaan evalueren — niet omdat de data verkeerd is, maar omdat ze een productieafhankelijkheid hebben genomen zonder enig contract erachter.
5. Er is geen conversie-endpoint
Frankfurter documenteert dit bewust: haal de koers op en vermenigvuldig. Drie regels code.
Het zijn ook drie regels die op zes plekken in je codebase net iets anders worden geschreven, waarbij er op één plek gedeeld wordt waar vermenigvuldigd hoort. Een apart convert-endpoint is geen technische noodzaak; het is een manier om precies één implementatie van de afrondings- en richtingsregels te hebben. Wie ooit een bug heeft uitgerold waarbij EUR→USD en USD→EUR 0,3% uiteenliepen, weet waarom dit telt. Onze gids over valuta-afronding en decimalen dekt de rest van dat mijnenveld.
Frankfurter API-alternatieven vergeleken
De details van de gratis pakketten hieronder zijn zoals elke aanbieder ze publiceerde op het moment van schrijven. Controleer ze voor je je vastlegt — gratis pakketten veranderen vaker dan documentatie.
| API | Gratis pakket | Updatefrequentie | Authenticatie | Basisvaluta | Het best voor |
|---|---|---|---|---|---|
| Frankfurter | Onbeperkt (misbruiklimiet, geen SLA) | Dagelijks, werkdagen | Geen | Elke | Hobbyprojecten, boekhouding, historisch onderzoek |
| Zelf gehoste Frankfurter | Gratis + eigen infrastructuurkosten | Dagelijks, werkdagen | De jouwe | Elke | Teams die controle willen en al Docker draaien |
| Finexly | 1.000 verzoeken/maand | Elke minuut tijdens markturen | Bearer-sleutel | Elke (eigen basis in hogere pakketten) | Producten die intraday koersen en een supportkanaal nodig hebben |
| ExchangeRate-API | ~1.500 verzoeken/maand | Dagelijks | Sleutel | Elke | Dashboards die één keer per dag verversen |
| Open Exchange Rates | 1.000 verzoeken/maand | Per uur | Sleutel | Alleen USD in gratis | Serverapps die met een USD-basis kunnen leven |
| Fixer.io | 100 verzoeken/maand | Per uur | Sleutel | Alleen EUR in gratis | Bestaande integraties |
Enkele daarvan zetten we naast elkaar in de valuta-API-vergelijking en in onze vergelijking van realtime wisselkoers-API's.
Optie 1: Frankfurter zelf hosten
Het meest onderbenutte antwoord. Frankfurter publiceert een Docker-image, en zelf draaien haalt de twee dingen weg waar productieteams zich echt zorgen over maken: de gedeelde rate limiter en het gebrek aan controle.
docker run -d -p 8080:8080 --name frankfurter \
lineofflight/frankfurterWat je krijgt: onbeperkte interne aanroepen, je eigen beschikbaarheidslot en de mogelijkheid één bron vast te zetten. Wat je erbij neemt: een container, een database, monitoring en iemand die opmerkt dat de upstream-verzameling stukloopt op een bankfeestdag. Dat is een reële kostenpost — in essentie het argument uit onze make-or-buy-analyse, toegepast op code die iemand anders al schreef.
Zelf hosten is de juiste keuze als je volume hoog is, je latency-eisen streng zijn en dagelijkse referentiekoersen echt volstaan. Het helpt totaal niet als het probleem is dat je intraday koersen nodig hebt — dan draai je alleen je eigen kopie van dezelfde dagelijkse data.
Optie 2: overstappen naar een API met sleutel en intraday koersen
Ben je hier vanwege versheid van koersen, dekking van exotische paren, of de behoefte dat iemand een e-mail beantwoordt, dan is een commerciële API met sleutel het eerlijke antwoord.
Dezelfde taak aan beide kanten. Eerst Frankfurter:
curl "https://api.frankfurter.dev/v2/rate/USD/EUR"En het Finexly-equivalent:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/rate?from=USD&to=EUR"{ "pair": "USD_EUR", "rate": 0.9215 }Endpointvergelijking
| Taak | Frankfurter v2 | Finexly v1 |
|---|---|---|
| Valuta's opvragen | GET /v2/currencies | GET /v1/currencies |
| Eén paar | GET /v2/rate/EUR/USD | GET /v1/rate?from=EUR&to=USD |
| Meerdere paren | GET /v2/rates?base=USD"es=EUR,GBP | GET /v1/convert?q=USD_EUR,USD_GBP |
| Bedrag omrekenen | (bestaat niet — zelf vermenigvuldigen) | GET /v1/convert-amount?from=USD&to=EUR&amount=100 |
| Historie | GET /v2/rates?date=1999-01-04 | Betaalde pakketten — zie de gids voor historische koersen |
BASE_QUOTE-paren, waardoor je USD_EUR en GBP_JPY in hetzelfde verzoek ophaalt zonder kruisdeling.Een migratiewrapper
Verspreid geen nieuwe client door je hele codebase. Zet beide achter één interface, zodat terugschakelen een configuratiewijziging is:
import os
import requests
FINEXLY_KEY = os.environ["FINEXLY_API_KEY"]
def get_rate(base: str, quote: str, provider: str = "finexly") -> float:
"""Return the mid-market rate for base->quote."""
if provider == "frankfurter":
r = requests.get(
f"https://api.frankfurter.dev/v2/rate/{base}/{quote}",
timeout=5,
)
r.raise_for_status()
return float(r.json()["rate"])
r = requests.get(
"https://api.finexly.com/v1/rate",
params={"from": base, "to": quote},
headers={"Authorization": f"Bearer {FINEXLY_KEY}"},
timeout=5,
)
r.raise_for_status()
return float(r.json()["rate"])
print(get_rate("USD", "EUR"))Twee details om over te nemen. De API-sleutel komt uit de omgeving, nooit uit de broncode — de Finexly-documentatie merkt op dat sleutels die als queryparameter worden meegegeven kunnen lekken via serverlogs en HTTP Referrer-headers, dus de Authorization-header is de productieroute. En elke aanroep heeft een timeout, want de standaard in de meeste HTTP-clients is "eeuwig wachten".
Houd de responseheaders X-RateLimit-Limit, X-RateLimit-Used en X-RateLimit-Units in de gaten om je quotumverbruik live te zien. Precies die telemetrie krijg je niet van een API zonder authenticatie, en het is vaak de echte reden dat teams overstappen.
Optie 3: de hybride — cache de een, val terug op de ander
Het patroon waar de meeste productiesystemen naartoe convergeren. Gebruik je primaire aanbieder, cache stevig en houd de gratis, niet-geauthenticeerde API als laatste redmiddel:
const CACHE = new Map();
const TTL_MS = 60_000;
async function getRate(base, quote) {
const key = `${base}_${quote}`;
const hit = CACHE.get(key);
if (hit && Date.now() - hit.at < TTL_MS) return hit.rate;
let rate;
try {
const res = await fetch(
`https://api.finexly.com/v1/rate?from=${base}&to=${quote}`,
{ headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
rate = (await res.json()).rate;
} catch (err) {
// Degrade to daily reference rates rather than failing the request
const res = await fetch(`https://api.frankfurter.dev/v2/rate/${base}/${quote}`);
rate = (await res.json()).rate;
}
CACHE.set(key, { rate, at: Date.now() });
return rate;
}Een cache van 60 seconden op een gratis pakket van 1.000 verzoeken dekt een kleine app ruimschoots, omdat je aanroepvolume een functie van tijd wordt in plaats van verkeer. Markeer fallback-responses in je logs, zodat een stille degradatie naar de koers van gisteren niet een week onopgemerkt blijft. Meer over TTL-keuze en retry-gedrag staat in onze gids over caching en foutafhandeling.
Een beslischecklist
Loop de lijst af en stop bij de eerste "ja":
- Moeten koersen tijdens de handelsdag veranderen? → Je hebt een marktdata-API nodig, geen referentiekoers-API.
- Is dit een gereguleerde of gecontroleerde stroom? → Zet één benoemde bron vast, bewaar de gebruikte koers, leid hem nooit opnieuw af.
- Hoog aanroepvolume maar dagkoersen volstaan? → Host Frankfurter zelf.
- Heb je iemand nodig die reageert als het stukgaat? → Je hebt een pakket met sleutel en supportniveau nodig.
- Niets van bovenstaande? → Blijf op Frankfurter. Cache het, handel het weekendgat af en besteed je tijd elders.
De meeste teams die op zoek gaan naar Frankfurter API-alternatieven ontdekken bij stap 5 dat hun echte probleem een ontbrekende cache en een onafgehandelde zondag was.
Veelgestelde vragen
Is de Frankfurter API echt gratis voor commercieel gebruik? Ja. Het project stelt dat het gratis is voor commercieel gebruik, zonder maandelijks of dagelijks quotum — verzoeken worden alleen gelimiteerd om misbruik te voorkomen. De keerzijde: geen SLA en geen supportcontract, dus het risico ligt bij jou.
Levert Frankfurter alleen ECB-koersen?
Niet meer. De v2-API mengt data van 84 centrale banken over 201 valuta's, en met de parameter providers beperk je het tot één bron. De wijdverbreide omschrijving "alleen ECB, 30 valuta's" slaat op oudere versies.
Waarom geeft Frankfurter in het weekend geen data? Omdat centrale banken op niet-werkdagen geen referentiekoersen publiceren. Elke API die op centralebankdata is gebouwd heeft hetzelfde gat. Je schuift de laatst gepubliceerde koers door, of je gebruikt een marktbron die continu noteert.
Wat is het beste gratis alternatief voor Frankfurter? Dat hangt af van wat "gratis" je moet opleveren. Voor onbeperkte dagkoersen verslaat niets Frankfurter — host het zelf. Voor een gratis pakket met intraday updates en een echte API-sleutel geeft het gratis plan van Finexly je 1.000 verzoeken per maand over 170+ valuta's. Zie onze gids voor gratis valuta-API's voor het bredere beeld.
Kan ik Frankfurter en een betaalde API samen gebruiken? Ja, en het is een verstandige architectuur. Stuur normaal verkeer naar je primaire aanbieder en val bij een fout terug op Frankfurter, zoals in het hybride voorbeeld hierboven. Zorg alleen dat fallback-responses gelogd worden, want ze dragen andere versheidsgaranties.
Aan de slag
Volstaan dagelijkse referentiekoersen voor wat je bouwt, blijf dan bij Frankfurter — het is een goed project en het kost je niets. Heb je koersen nodig die gedurende de dag bewegen, dekking voorbij de referentiesets van centrale banken, of gebruiksheaders die je echt kunt monitoren, haal dan je gratis Finexly API-sleutel — geen creditcard nodig. Begin met 1.000 verzoeken per maand over 170+ valuta's en schaal mee met je groei, of vergelijk eerst de pakketten op onze prijzenpagina.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →