openkvk.nl is een database ontstaan uit een verzameling van gegevens uit verschillende bronnen waaronder kvk.nl, belastingdienst.nl en rechtspraak.nl. Deze bronnen zijn openbaar en gebonden aan wettelijke publicatie. Om de data uit deze bronnen te kunnen integreren in dit systeem en doorzoekbaar te maken draaien we dagelijks onderhoudsqueries, en per kwartaal verversen we de bronnen compleet.
Deze data wordt je bij normaal gebruik kosteloos aangeboden. Gebruik mag niet lijden tot overbelasting van het systeem. De dienst is dan ook toegangelijk voor iedereen wie de voorgaande regel in acht neemt. Onder normaal gebruik verstaan we in ieder geval niet: het dumpen van de volledige database, op welke manier dan ook. We wijzen uitdrukkelijk nogmaals op de Databankenwet Artikel 4. Van deze dienst worden alle queries opgeslagen voor onderzoeksdoeleinden. Hiermee wordt tevens een overzicht per gebruiker van de dienst gegenereerd. Bij buitensporig gebruik krijgt de gebruiker een verwijzing. Ook limiteren we, zover wij kunnen limiteren, het hergebruik voor commerciele uitingen als Direct Marketing. Geen ingeschreven bedrijf zit te wachten op spam. Dumps van de volledige dataset worden en zijn onder strikte voorwaarden afgegeven aan derden, voor innovatieve ideeën, projecten en analyse. Zij blijven aan voorgaande beperkingen verbonden. Het gebruik van de API geschied alleen via api.openkvk.nl.
De inhoud van de database wordt gevormd van uit een relationele database. Een (oude) sample is beschikbaar. Tijdelijk zijn een aantal tabellen niet beschikbaar vanwege een database herstructurering.
CREATE TABLE "sys"."kvk" (
"kvk" BIGINT,
"bedrijfsnaam" VARCHAR(256),
"kvks" INTEGER,
"sub" INTEGER,
"adres" VARCHAR(256),
"postcode" VARCHAR(10),
"plaats" VARCHAR(32),
"type" VARCHAR(14),
"website" VARCHAR(128)
);
CREATE TABLE "sys"."anbikvk" (
"anbi" INTEGER,
"kvks" INTEGER
);
CREATE TABLE "sys"."anbi" (
"naam" VARCHAR(128),
"vestigingsplaats" VARCHAR(64),
"beschikking" DATE,
"einddatum" DATE,
"intrekking" DATE
);
CREATE TABLE "sys"."faillissementen" (
"kvks" INTEGER,
"bedrijfsnaam" VARCHAR(255),
"plaats" VARCHAR(32),
"rechtbank" VARCHAR(64),
"rolnummer" VARCHAR(16),
"status" VARCHAR(16),
"datum" DATE
);
Om je via het web queries te laten uitvoeren gebruiken wij de DBSlayer handler van de
Cherokee webserver. Door middel van een reverse proxy kun
je op je eigen site zelf AJAX requests doen, deze technologie heeft Cherokee ook aan boord.
Flash applicaties kunnen direct verbinden, er is een crossdomain.xml geplaatst.
Update: Zowel /json als /suggest hebben nu de
Access-Control-Allow-Origin header.
Een request is een correcte SQL92 query netjes HTTP gecodeerd, en wordt verstuurd als een normale GET request.
Bijvoorbeeld: /api/SELECT * FROM kvk WHERE kvks=20147376,
mocht je dit voorbeeld erg letterlijk willen nemen zet er dan minimaal LIMIT 100 achter,
anders doen wij dat voor jou door middel van een redirect.
Verschillende programmeertalen gebruiken verschillende array formaten, we ondersteunen er een heleboel.
Wil je nu liever een alleen kvknummer terugkrijgen op basis van een volledige string, dan kan dat uiteraard ook.
Update: met de querystring ?max= kun je het aantal resultaten op de sphinx query vergroten. Voorlopig tot 1000 (limitatie in Sphinx).
Ga je een webapp maken in PHP dan kun het beste hier eens een kijkje nemen: http://www.cherokee-project.com/doc/cookbook_dbslayer.html
Sphinx zit al enige tijd ook in MonetDB zelf, maar de optimiser moet nog worden getuned. De query die je in het javascript stukje is momenteel de enige vorm met een multi join die goed gaat. Er wordt aan gewerkt, als je het anders doet gaat het in plaats van in 100ms, 15s duren. Een voorbeeld;
SELECT x.kvk, x.bedrijfsnaam, x.adres, x.postcode, x.plaats, x.type,
NOT(anbikvk.kvks is null AND anbikvk.intrekking is null) AS "anbi", status, x.kvks, x.sub
FROM
(SELECT kvk.kvk, kvk.bedrijfsnaam, kvk.adres, kvk.postcode, kvk.plaats, kvk.type, kvk.kvks, kvk.sub
FROM sphinx_searchIndex('Nieuwe Erven 2', 'openkvk') AS fts, kvk where kvk.kvk = fts.id) AS x
LEFT JOIN anbikvk ON x.kvks = anbikvk.kvks
LEFT JOIN faillissementen ON x.kvks = faillissementen.kvk LIMIT 200 OFFSET 0;
In het bovenstaande voorbeeld zie je dat sphinx_searchIndex wordt gebruikt om een nieuwe tabel te maken, die tabel wordt gealiased als fts, free-text-search. Behalve het id komt er meer uit deze tabel terug, zoals de kans dat het bepaalde documentid overeenkomt met de zoekopdracht. Het documentid, zoals Sphinx dit noemt, is het volledige, 64bit kvk nummer. Dit omdat een Dixons in Oss hetzelfde korte (kvks) nummer heeft als de Dixons in Zaandam. De vorm van de query heeft een reden, een van die redenen is het negatief prioriseren van externe SQL-functies binnen MonetDB. Momenteel kan MonetDB geen kostenanalyse maken van een externe SQL-functie en zal de join (die enorm duur is) dus altijd verkiezen als 'minder dure'. Wil je zelf zoeken, en geen ANBI of Faillissement informatie? Dan zul je er geen last van hebben, immers, je doet geen join over alle data. Zoals je kunt zien kun je dat gebruik maken van de query tussen de (...).
Update: we hebben nu ook de optie sphinx_searchIndexLimit daarmee kun je meer dan de standaard 20 resultaten ophalen. het gebruik is ook vrij simpel:
SELECT * FROM sphinx_searchIndexLimit('vve', 'openkvk', 1000) LIMIT 1000;
Met de introductie van een altijd beschikbare AJAX search (van 56 miljoen euro) op kvk.nl vinden wij dat we ook het goede voorbeeld moeten geven, en zo'n initiatief positief moeten benaderen. Het is misschien net niet helemaal wat je zou verwachten van een AJAX search, maar er is potentie. Met de nieuwe service bieden we je een directe interface naar de AJAX search, maar met nette JSON uitvoer. Toegang is bijna analoog aan onze Full Text Search, uiteraard gaan we met de Kamer van Koophandel Nederland in overleg om dit gewoon via hun eigen servers te krijgen. Na twee jaar strijden is KvK.nl immers 's nachts open, nu nog een API.
Zijn de gegevens die je opvraagt verouderd, bijvoorbeeld door een adreswijziging. Of mis je de website bij de gegevens? Je kunt als je met ctrl op het kvk-nummer klikt een suggestie doen om dat nummer mee te nemen in de dagelijkse refresh. Dat kun je uiteraard ook via de api doen:
/suggest/[kvknummer|postcode6PP]
Je kunt openkvk bereiken op twitter.