npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@quellenkontor/sdk

v0.1.2

Published

Offizielles SDK für die Quellenkontor-API: geprüfte HR-Daten mit Quelle und Gültigkeit. German HR reference data with source and validity: minimum wage, social security, public holidays.

Readme

@quellenkontor/sdk

English: Official JavaScript SDK for the Quellenkontor API: verified German HR reference data (minimum wage, social security ceilings and rates, public holidays by state, notice periods and more), each value with its legal basis, official source and effective date. No dependencies, Node.js 18+, ESM and CommonJS. English docs: quellenkontor.dev/en/docs/sdk-javascript. Field and parameter names are German, as in the API; options and the error class also have English names (see English summary). A free key: quellenkontor.dev/en/sign-in.

Offizielles SDK für die Quellenkontor-API: geprüfte HR-Daten für Deutschland mit Quelle, Rechtsgrundlage und Gültigkeit. Mindestlohn, Rechengrößen, Beitragssätze, Sachbezüge, Pfändungsfreigrenzen, Übergangsbereich, Kündigungsfristen, Urlaub, Mutterschutz, Feiertage, Arbeitstage und weitere, insgesamt 23 Datensätze.

Ohne Abhängigkeiten, ab Node.js 18, auch im Browser und in Edge-Laufzeiten. Das Paket nutzt nur fetch und keine Node-Module.

npm install @quellenkontor/sdk
import { Quellenkontor } from "@quellenkontor/sdk";

const qk = new Quellenkontor(process.env.QK_KEY);

const ml = await qk.hr.mindestlohn({ datum: "2027-01-15" });
console.log(ml.mindestlohn_brutto_stunde, ml.minijob_grenze_monat); // 14.6 633

const frist = await qk.hr.kuendigungsfrist({ eintritt: "2017-03-01", zugang: "2026-11-10" });
console.log(frist.ende); // "2027-02-28"

const verlauf = await qk.hr.verlauf("mindestlohn");
console.log(verlauf.verlauf[0].mindestlohn_brutto_stunde); // typisiert je Datensatz

CommonJS geht genauso:

const { Quellenkontor } = require("@quellenkontor/sdk");

Optionen

new Quellenkontor(apiKey?, optionen?) oder new Quellenkontor(optionen). Jede Option hat einen deutschen und, wo es ihn gibt, einen englischen Namen; beide gelten.

| Option | Englisch | Standard | Bedeutung | |---|---|---|---| | apiKey | apiKey | QK_KEY aus der Umgebung | API-Schlüssel | | basisUrl | baseUrl | https://api.quellenkontor.dev/v1 | Adresse der API | | timeoutMs | timeoutMs | 15000 | Zeitlimit je Versuch in Millisekunden | | wiederholungen | retries | 2 | Wiederholungen bei Netzfehlern und 408, 500, 502, 503, 504 | | maxProSekunde | maxPerSecond | 8 | Höchstens so viele Anfragen je Sekunde und Instanz, 0 schaltet die Bremse ab | | cache | cache | true | Zwischenspeicher im Speicher dieser Instanz mit ETag und If-None-Match | | cacheTtlMs | cacheTtlMs | 300000 | So lange kommt eine Antwort ohne neue Anfrage aus dem Speicher | | cacheMaxEintraege | cacheMaxEntries | 500 | Höchstzahl gemerkter Antworten, die am längsten ungenutzte fällt heraus | | offline | offline | true | Offline-Stand nutzen, wenn die API nicht erreichbar ist | | offlineWarnungTage | offlineMaxAgeDays | 30 | Ab diesem Alter trägt eine Offline-Antwort einen Hinweis in hinweise | | fetch | fetch | globalThis.fetch | Eigene fetch-Funktion, etwa für Tests oder einen Proxy |

Je Aufruf lässt sich ein AbortSignal mitgeben; es bricht Anfrage, Wartezeiten und Wiederholungen sofort ab (Fehlercode abgebrochen):

const c = new AbortController();
setTimeout(() => c.abort(), 2000);
await qk.hr.mindestlohn({ datum: "2027-01-15" }, { signal: c.signal });

Wiederholungen und Wartezeiten

| Antwort | Verhalten des SDK | |---|---| | Netzfehler oder Zeitlimit | bis zu wiederholungen Mal erneut, Pause 300 ms, dann 600 ms, 1200 ms; danach Offline-Stand oder Fehler netzwerk | | 408, 500, 502, 503, 504 | wie Netzfehler, ein Retry-After gilt als Mindestpause; danach Offline-Stand oder der Fehler der API | | 429 zu_schnell | Retry-After abwarten (Sekunden oder HTTP-Datum, höchstens 30 s), bis zu 5 Mal, zählt nicht als Wiederholung | | 429 kontingent_erreicht | kein neuer Versuch, Fehler | | 403 mit x-vercel-mitigated | Fehler ausgebremst: langsamer abfragen und später erneut versuchen | | 304 | die gemerkte Antwort gilt weiter und kostet kein Kontingent | | andere 4xx | sofort Fehler mit Code und Parameter der API |

Offline-Stand

Der Verlauf aller 15 Tabellen-Datensätze liegt im Paket. Ist die API nach allen Wiederholungen nicht erreichbar oder antwortet mit 5xx, beantwortet das SDK Abfragen dieser Datensätze aus dem Offline-Stand: die Antwort trägt offline: true, datenstand und einen Satz in hinweise, aber kein zitat, vorheriger_wert oder naechster_wert. Rechner wie kuendigungsfrist oder dienstwagen bleiben ohne Verbindung ein Fehler.

Die Mindestausbildungsvergütung richtet sich auch offline nach dem Ausbildungsbeginn (beginn), nicht nach dem heutigen Tag. Der Offline-Stand wird erst geladen, wenn er gebraucht wird; Bundler legen ihn in einen eigenen Teil. Direkt lesen lässt er sich über import { OFFLINE_DATEN } from "@quellenkontor/sdk/offline", ohne die API zu fragen über qk.offlineAntwort("/hr/mindestlohn", { datum: "2026-01-01" }).

Fehler

Fehler kommen als QuellenkontorFehler (englisch QuellenkontorError, dieselbe Klasse) mit status, code und parameter. Die Codes sind stabil: die der API (etwa schluessel_fehlt, schluessel_ungueltig, kontingent_erreicht, zu_schnell, parameter_fehlt, ungueltiger_parameter, kein_wert) und die des SDK:

| Code | Status | Bedeutung | |---|---|---| | netzwerk | 0 | keine Verbindung nach allen Wiederholungen | | abgebrochen | 0 | das AbortSignal hat ausgelöst | | kein_wert_offline | 0 | der Offline-Stand hat für den Stichtag keinen Wert | | kein_fetch | 0 | keine fetch-Funktion vorhanden (Node.js älter als 18) | | ausgebremst | 403 | Schutzschicht vor der API |

Umgebung

| Variable | Bedeutung | |---|---| | QK_KEY | API-Schlüssel, wenn apiKey fehlt |

Ohne Schlüssel liefert die API mindestlohn, feiertage und rechengroessen als Sandbox (50 Abfragen am Tag je Adresse). Kostenloser Schlüssel mit 500 Abfragen im Monat: https://quellenkontor.dev/anmelden

English summary

English aliases: options baseUrl, retries, maxPerSecond, cacheMaxEntries, offlineMaxAgeDays; error class QuellenkontorError; methods request() and clearCache(). Error code values stay the same in both languages. Retries: network errors and 408/500/502/503/504 are retried retries times with backoff (Retry-After is honoured), 429 zu_schnell waits for Retry-After up to 5 times, 429 kontingent_erreicht fails at once. When the API stays unreachable, table datasets are answered from the bundled offline snapshot (offline: true).

Dokumentation: https://quellenkontor.dev/docs/sdk-javascript · Änderungen: CHANGELOG.md