{"openapi":"3.1.0","info":{"title":"Spaarradar API","version":"0.2.0","description":"Read-only API of the Dutch savings-rate comparison. All calculations are done server-side for the given amount. Every endpoint answers with a weak ETag and honours If-None-Match with 304, so polling is cheap; responses are publicly cacheable for the max-age in Cache-Control."},"paths":{"/api/products":{"get":{"summary":"Filtered, calculated and sorted list of DGS-verified savings offers","parameters":[{"name":"amount","in":"query","description":"Amount in EUR used in every calculation","schema":{"type":"number","default":50000}},{"name":"horizon","in":"query","description":"Comparison horizon in months for flexible/notice accounts","schema":{"type":"integer","default":12}},{"name":"type","in":"query","description":"flexible | notice | deposit | all","schema":{"type":"string","default":"flexible"}},{"name":"terms","in":"query","description":"Deposit terms in months, comma-separated (e.g. 12,24)","schema":{"type":"string"}},{"name":"termMin","in":"query","description":"Minimum deposit term (months)","schema":{"type":"integer"}},{"name":"termMax","in":"query","description":"Maximum deposit term (months)","schema":{"type":"integer"}},{"name":"channel","in":"query","description":"all | direct | raisin | platform","schema":{"type":"string","default":"all"}},{"name":"country","in":"query","description":"Bank countries, ISO alpha-2, comma-separated","schema":{"type":"string"}},{"name":"dgsCountry","in":"query","description":"DGS countries, ISO alpha-2, comma-separated","schema":{"type":"string"}},{"name":"fullDgs","in":"query","description":"Entire amount must be covered by a verified DGS","schema":{"type":"boolean","default":true}},{"name":"withholding","in":"query","description":"all | none | reducible | applicable","schema":{"type":"string","default":"all"}},{"name":"promotions","in":"query","description":"include | exclude (calculate every offer at its rate after the promotion; nothing is hidden) | only","schema":{"type":"string","default":"include"}},{"name":"newCustomers","in":"query","description":"all | yes | no","schema":{"type":"string","default":"all"}},{"name":"payout","in":"query","description":"MONTHLY,QUARTERLY,ANNUALLY,AT_MATURITY,OTHER (comma-separated)","schema":{"type":"string"}},{"name":"currentAccount","in":"query","description":"all | no (no current account required)","schema":{"type":"string","default":"all"}},{"name":"fees","in":"query","description":"all | none","schema":{"type":"string","default":"all"}},{"name":"earlyWithdrawal","in":"query","description":"all | allowed (deposits that can be ended early)","schema":{"type":"string","default":"all"}},{"name":"noticeMax","in":"query","description":"Maximum notice period in days","schema":{"type":"integer"}},{"name":"freshness","in":"query","description":"all | 24h | official | confirmed","schema":{"type":"string","default":"all"}},{"name":"includeIneligible","in":"query","description":"Also return offers whose min/max does not fit the amount","schema":{"type":"boolean","default":false}},{"name":"sort","in":"query","description":"return (euros per year at the comparable annual yield) | effective (net effective annual rate) | headline | term | bank | country | verified | min","schema":{"type":"string","default":"return"}},{"name":"brand","in":"query","description":"Only this brand (id or name)","schema":{"type":"string"}},{"name":"zoek","in":"query","description":"Free-text search over bank, product and institution name","schema":{"type":"string"}},{"name":"order","in":"query","description":"asc | desc","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","description":"Page size (max 500)","schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"ProductListResult: items[] (OfferView with calc + dgs split), total, hiddenByDgs, hiddenIneligible, facets, termCurve (deposits: best rate per term), typeMax, market, generatedAt"}}}},"/api/products/{id}":{"get":{"summary":"Offer detail with monthly calculation steps (the list leaves calc.steps empty), rate history, sources, events and same-licence offers","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"amount","in":"query","description":"Amount in EUR","schema":{"type":"number"}},{"name":"horizon","in":"query","description":"Months","schema":{"type":"integer"}}],"responses":{"200":{"description":"OfferDetail"},"404":{"description":"Unknown offer"}}}},"/api/products/export":{"get":{"summary":"The comparison as CSV (semicolon-separated, decimal comma); same parameters as /api/products, every row","responses":{"200":{"description":"text/csv"}}}},"/api/institutions":{"get":{"summary":"Legal institutions with DGS scheme, limit, verification source and brands","responses":{"200":{"description":"items[]"}}}},"/api/rates/history":{"get":{"summary":"Historic rates: one offer, every offer, or the daily market maximum","description":"With offerId: the append-only rate-plan history of that offer. Without: every historic rate plan (newest first), filterable by brand and product type. With view=market: the best headline rate per day per product type over `days` days, across offers whose institution has a verified DGS.","parameters":[{"name":"offerId","in":"query","description":"Offer id; returns that offer's own history","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max rows for a single offer","schema":{"type":"integer","default":100}},{"name":"brand","in":"query","description":"Brand id (listing mode)","schema":{"type":"string"}},{"name":"type","in":"query","description":"all | flexible | notice | deposit (listing mode)","schema":{"type":"string","default":"all"}},{"name":"page","in":"query","description":"Page number (listing mode)","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","description":"Page size, max 500 (listing mode)","schema":{"type":"integer","default":100}},{"name":"view","in":"query","description":"plans | market","schema":{"type":"string","default":"plans"}},{"name":"days","in":"query","description":"Window for view=market","schema":{"type":"integer","default":90}}],"responses":{"200":{"description":"items[] (rate plans, or {date, flexible, notice, deposit12, deposit60} per day for view=market)"}}}},"/api/changes":{"get":{"summary":"Recent change events (rate up/down, promo start/end, new/removed offers, DGS changes)","parameters":[{"name":"limit","in":"query","description":"Max rows","schema":{"type":"integer","default":50}}],"responses":{"200":{"description":"items[]"}}}},"/api/meta/last-updated":{"get":{"summary":"Freshness overview and source health","responses":{"200":{"description":"MetaSummary"}}}},"/api/health":{"get":{"summary":"Liveness/readiness","responses":{"200":{"description":"ok"},"503":{"description":"degraded"}}}}}}